Scala 如何在slick中利用共享会话进行多数据库操作?

Scala 如何在slick中利用共享会话进行多数据库操作?,scala,slick,Scala,Slick,我正在使用slick,对slick会话有一个问题。我先举个例子, Order类包含行项目,Order可以获取行项目或删除其中一个行项目,Order还可以自行定价。以下是伪代码: 阶级秩序{ def getLineItems= database withSesison{ //get Line Items from db repository } def removeLineItem(itemId: String) = database withTransaction

我正在使用slick,对slick会话有一个问题。我先举个例子, Order类包含行项目,Order可以获取行项目或删除其中一个行项目,Order还可以自行定价。以下是伪代码:

阶级秩序{

  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,这将创建另一个新会话

从slick文档中,我知道每个会话都在打开一个jdbc连接,所以在一次方法调用中,它将创建3个数据库连接,这是对连接资源的浪费。有没有办法只使用一个连接来完成此操作

我知道slick有一个threadLocalSession,它将会话绑定到ThreadLocal,但从我看来,我们应该避免使用threadLocalSession


请提供帮助,谢谢。

您可以使用Curry传递隐式会话,而不是为每个方法创建新会话/事务

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)
}

隐式会话是一些精巧示例的设置方式。

谢谢Rob,你说得对。但有时我不想把会话放在外面,因为我可能会在UI层或其他地方调用getLineItems之类的方法,所以我需要将会话放在实体对象中,这样对用户来说很方便。