有没有人成功地将 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 的事务管理。这个问题是我之前问题的一个更具体的变体:How to integrate the Scala Squeryl ORB with play 2.0 framework? .
最佳答案
这两天一直困扰着我,所以我喝了点咖啡,浪费了我生命中的一个小时,但我想向你展示我是如何让它工作的:
在您的 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 提供。
关于playframework-2.0 - 如何在 play 2.0 中使用 Squeryl 的 externalTransactionManagementAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767601/