我有一个Play应用程序,我在其中使用Slick处理数据库通信。
到目前为止一切顺利,但我有以下问题:我有一个Akka actor与远程系统通信,从这些系统获取数据,并且必须使用这些数据更新数据库。
现在,我在模型中有一些更新db的方法,但是他们期望一个隐含的Session参数:如果对这些方法的调用来自Controller操作,因为它们是DBActions,它们会自动处理会话,但是如果我想从Controller外部调用这些方法(即,从那些演员那里),我应该创建自己的会话(使用Database.fromURL)吗?它是否会干扰控制器自动创建和处理的那个?
答案 0 :(得分:3)
好奇并做了一些挖掘,DBAction
类扩展了具有apply方法的CurrentDBAction
特征:
def apply[A](dbName: String, bodyParser: BodyParser[A] = anyContent)(requestHandler: DBSessionRequest[A] => SimpleResult)(implicit app: Application = null) = {
val current = db(dbName, Option(app))
applyForDB(current)(requestHandler)(bodyParser)(current.withSession)(errorPage)
}
基本上它正在做的是创建一个DB
对象并将其与applyForDB
函数一起传递给withSession
这应该是(因为我不是专家而且源代码是不那么容易阅读)与这样做完全相同
DB.withSession {
implicit session: Session => {
/* some computation */
}
}
可以找到代码here。