使用封闭数据库会话初始化特征

时间:2014-02-28 16:49:42

标签: scala session initialization slick

我们有几个traits / classes / case类,其val使用数据库会话初始化(我们在MySql上使用Slick,因此下面的所有Sessions都有类型{{1} })。初始化特征的方法已经有一个开放的数据库会话,所以我希望能够将它传递给初始化时使用的特征;然而,一旦特征初始化,会话将自动关闭,因此我不希望特征保持对已关闭会话的引用,以消除我们不小心尝试使用它的可能性。 / p>

scala.slick.session.Session

这就是我的代码目前的样子 - 我找不到将trait MyTrait { private def initField1(implicit session: Session) = // init code val field1 = db withSession { implicit sesssion: Session => initField1 } } def initMyTrait(implicit session: Session) = new MyTrait {} 的会话传递给initMyTrait的好方法,所以我需要打开第二个会话来初始化{{1 }}。我可以做类似

的事情
MyTrait

但是这会在初始化后的MyTrait.field1中留下关闭的会话

1 个答案:

答案 0 :(得分:1)

我会尽量避免需要数据库连接来初始化特征。另一种方法是使用缓存方法代替val,例如

private var field1Cache: ... = null
def field1(implicit session:Session) = {
  if( field1Cache == null ){
    field1Cache = initField1
  }
  field1Cache
}

或者你可以让这个特质成为一个阶级,然后进行私人辩论。