使用Play进行浮动:从控制器DBAction外部进行数据库更新

时间:2014-05-07 16:18:13

标签: scala playframework akka actor slick

我有一个Play应用程序,我在其中使用Slick处理数据库通信。

到目前为止一切顺利,但我有以下问题:我有一个Akka actor与远程系统通信,从这些系统获取数据,并且必须使用这些数据更新数据库。

现在,我在模型中有一些更新db的方法,但是他们期望一个隐含的Session参数:如果对这些方法的调用来自Controller操作,因为它们是DBActions,它们会自动处理会话,但是如果我想从Controller外部调用这些方法(即,从那些演员那里),我应该创建自己的会话(使用Database.fromURL)吗?它是否会干扰控制器自动创建和处理的那个?

1 个答案:

答案 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