光滑的Play: db更新从外部控制器DBAction



我有一个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 */
  }
}

代码可以在这里找到

最新更新