如何在光滑中使用共享会话进行多个数据库操作?

时间:2014-03-06 08:09:21

标签: scala slick

我正在使用光滑的,并且有关于光滑会话的问题。我先举一个例子, 订单类包含订单项,订单可以获取订单项或删除其中一个订单项,订单也可以自行定价。下面是伪代码:

班级订单{

  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。

请帮助,谢谢。

1 个答案:

答案 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