我有一个 Play 2.2.1 应用程序,它使用play-slick 0.5.0.8将数据保存到 Postgresql 后端,并使用SecureSocial 2.1.2来处理用户授权。
由于 play-slick 事务被阻塞,我根据插件 Wiki 中的说明在我的文件中创建了一个单独的slick-context
执行上下文:/conf/application.conf
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
这允许我创建一个在单独的执行上下文中运行并且不会阻塞默认线程池中的线程的控制器操作。例如。/app/controllers/Application.scala
:
示例一 - 使用 play-slick 的 DBAction:
import play.api.db.slick._
object Application extends Controller{
// this controller Action won't block threads in the default pool since DBAction uses my separate slick-context execution context
def recipes = DBAction { implicit rs =>
val recipes = Query(Recipes).list
Ok(recipes.mkString)
}
}
对于某些控制器操作,我希望能够将 SecureSocial 的操作(SecuredAction
等UserAwareAction
)与 play-slick 结合使用DBAction
。将两者结合起来的最佳方法是什么?
我意识到我可以做类似下面的事情,但我的理解是 DB 调用不会使用我单独slick-context
的,因此会阻塞默认线程池:
示例二 - 使用 SecureSocial 的操作:
import play.api.db.slick._
import securesocial.core._
object Application extends Controller{
// changing from a DBAction to a SecuredAction so that I can use SS's goodies
def recipes = SecuredAction { implicit request =>
val recipes = DB.withSession { implicit session:Session => Query(Recipes).list } // i'm guessing this WILL BLOCK the default thread pool since it isn't using my separate slick-context execution context??
Ok(recipes.mkString)
}
}
假设示例二将使用/阻止默认线程池而不是我的单独slick-context
线程池,我是否正确?如果是这样,有没有办法改变这种情况?
我显然可以通过增加 Play 的默认线程default-dispatcher
池(
协助表示赞赏!