我们有几个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
中留下关闭的会话
答案 0 :(得分:1)
我会尽量避免需要数据库连接来初始化特征。另一种方法是使用缓存方法代替val,例如
private var field1Cache: ... = null
def field1(implicit session:Session) = {
if( field1Cache == null ){
field1Cache = initField1
}
field1Cache
}
或者你可以让这个特质成为一个阶级,然后进行私人辩论。