我有一个Play应用程序,我正在使用Slick处理数据库通信。
到目前为止一切都很顺利,但是我有以下问题:我有一个Akka actor与远程系统通信,从这些系统获取数据,并且必须使用这些数据更新数据库。
现在,我有一些方法在模型中更新数据库,但他们期望一个隐式的会话参数:如果调用这些方法来自控制器的动作,因为它们是数据库,它们自动处理会话,但如果我想从控制器外部调用这些方法(即,从那些演员),我应该创建我自己的会话(使用Database.fromURL)吗?它会干扰控制器自动创建和处理的那个吗?
我很好奇,做了一些调查,DBAction
类扩展了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
对象并将其与withSession
一起传递给applyForDB
函数,这应该(应该,因为我不是专家,源代码不那么容易阅读)与执行此
DB.withSession {
implicit session: Session => {
/* some computation */
}
}
代码可以在这里找到