4

有没有人成功地将 Squeryl 的 externalTransactionManagementAdapter 与 play framework 2.0 一起使用?:

    object Global extends GlobalSettings {
      override def onStart(app: Application) {

        SessionFactory.externalTransactionManagementAdapter = Some(() => 
            Some(new Session(
                DB.getDataSource().getConnection(), 
                dbAdapter)
            )
        )
    }

我无法让 Squeryl 将连接返回到池中。它确实适用于SessionFactory.concreteFactory,但是我必须使用事务块而不是 squeryl 参与 Play 的事务管理。

这个问题是我之前的问题的一个更具体的变体:如何将 Scala Squeryl ORB 与 play 2.0 框架集成?.

4

2 回答 2

3

过去两天这一直困扰着我,所以我喝了杯咖啡,浪费了一个小时的生命,但我想告诉你我是如何做到的:

在你Global.scala说这个:

 override def onStart(app: Application) {
    SessionFactory.externalTransactionManagementAdapter = Some(() => {
    if(org.squeryl.Session.hasCurrentSession) {
      org.squeryl.Session.currentSessionOption.get
    }
    else {
      val s = new org.squeryl.Session(DB.getDataSource().getConnection(), new PostgreSqlAdapter){
        override def cleanup = {
          super.cleanup
          unbindFromCurrentThread
        }
      }
      s.bindToCurrentThread
      s
    }
    })
  }

然后你需要做一些清理工作,这样你的应用程序就不会出错(在同一个全局中):

  /**
   * cleans up Squeryl thread to each request
   */
  override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    org.squeryl.Session.currentSessionOption.foreach(_.unbindFromCurrentThread)
    super.onRouteRequest(request)
  }

如果我发现任何警告等,我会更新这个。清除的覆盖由http://lunajs.blogspot.ca/2011/06/squeryl-with-java-experiment.html提供

于 2012-03-28T14:45:23.757 回答
0

我目前正在“作弊”,使用SessionFactory.concreteFactoryand :

trait SquerylTransaction {
  def TransAction(f: Request[AnyContent] => Result): Action[AnyContent] = {
    Action { request =>
      transaction {
        f(request)
      }
    }
  }
}

在控制器中:

object Application extends Controller with SquerylTransaction {

  def doStuff() = TransAction { 
    //squeryl query      
  }
}

但德隆的解决方案可能会更好。

我的 Global.scala 看起来像这样:

object Global extends GlobalSettings {

  val dbAdapter = new PostgreSqlAdapter()

  override def onStart(app: Application): Unit = {
    SessionFactory.concreteFactory = Some(() =>
      Session.create(
        DB.getDataSource().getConnection(),
        dbAdapter))
  }

}
于 2012-04-03T16:18:09.450 回答