dba*_*bau 8 scala playframework securesocial play-slick playframework-2.2
我有一个Play 2.2.1应用程序,它使用play-slick 0.5.0.8将数据持久保存到Postgresql后端,而SecureSocial 2.1.2则用于处理用户授权.
由于播放光滑的事务是阻塞的,我slick-context在我的/conf/application.conf文件中创建了一个单独的执行上下文,根据插件的Wiki中的说明:
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这允许我创建一个在单独的执行上下文中运行的控制器Action,并且不会阻止默认线程池中的线程.例如./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)
}
}
Run Code Online (Sandbox Code Playgroud)
对于某些控制器操作我希望能够利用SecureSocial的操作(SecuredAction,UserAwareAction等)与播放光滑的结合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)
}
}
Run Code Online (Sandbox Code Playgroud)
假设示例二将使用/阻止默认线程池而不是单独的slick-context线程池,我是否正确?如果是这样,有没有办法改变这个?
我可以通过提高Play的默认线程池(default-dispatcher)来解决这个问题,但理想情况下我希望保持默认线程池非常精简,并在单独的池中运行所有阻塞DB调用.
协助赞赏!
要回答你的问题,
假设示例二将使用/阻止默认线程池而不是单独的光滑上下文线程池,我是否正确?如果是这样,
是的,那会耗尽/阻止默认池.
如果你想使用单独的slick-context线程池,那你可以试试这样的东西吗?
import scala.concurrent.Future
// Note the use of '.async' |
// V
def recipes = SecuredAction.async { implicit request =>
Future { // your code that may block
val recipes = DB.withSession { implicit s:Session =>
Query(Recipes).list
}
Ok(recipes.mkString)
}
}
Run Code Online (Sandbox Code Playgroud)
Future期待ExecutionContext(隐含的意志); 所有你需要传递一个play-slick使用的(隐式):
import play.api._
implicit val slickExecutionContext =
Akka.system.dispatchers.lookup("play.akka.actor.slick-context")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |