如何在Play 2.0中使用Squeryl的外部事务管理适配器?

时间:2012-03-19 09:21:04

标签: playframework-2.0 squeryl

有没有人成功使用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,但是我必须使用事务块而不是参与Play的事务管理的squeryl。

这个问题是我之前问题的一个更具体的变体:How to integrate the Scala Squeryl ORB with play 2.0 framework?

2 个答案:

答案 0 :(得分: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

的覆盖清除

答案 1 :(得分:0)

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

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      
  }
}

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

我的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))
  }

}