我正在使用光滑的,并且有关于光滑会话的问题。我先举一个例子, 订单类包含订单项,订单可以获取订单项或删除其中一个订单项,订单也可以自行定价。下面是伪代码:
班级订单{
def getLineItems= database withSesison{
//get Line Items from db repository
}
def removeLineItem(itemId: String) = database withTransaction{
implicit ss: Session =>
//Remove item from db
//Price the order
}
def priceOrder() = database withTransaction{
implicit ss: Session =>
//getLineItems
//recalculate order price by each line item
}
}
因此,当我尝试删除一个订单项时,它会创建一个新的会话和交易,然后它将调用priceOrder,它还会创建一个新的会话和事务,priceOrder将调用getLineItems,这将创建另一个新会话。
从光滑的文档中,我知道每个会话都在打开一个jdbc连接,因此在一个方法调用中它会创建3个数据库连接,这会浪费连接资源。有没有办法只使用一个连接来完成此操作?
我知道slick有一个threadLocalSession,它将会话绑定到本地的线程,但是从https://groups.google.com/forum/#!topic/scalaquery/Sg42HDEK34Q我发现我们应该避免使用threadLocalSession。
请帮助,谢谢。
答案 0 :(得分:0)
您可以使用currying来传递隐式会话,而不是为每个方法创建新的会话/事务。
def create(user: User)(implicit session: Session) = {
val id = Users.returning(Users.map(_.id)).insert(user)
user.copy(id = Some(id))
}
然后,在控制器或某个地方,当您想要调用方法时,您可以设置会话/事务,它将用于该块中的所有数据库工作。
// Create the user.
DB.withTransaction { implicit session: Session =>
Users.create(user)
}
隐式会话是如何设置一些Slick示例的。 https://github.com/slick/slick-examples/blob/master/src/main/scala/com/typesafe/slick/examples/lifted/MultiDBCakeExample.scala