PlaySlick с SecureSocial: запуск ввода-вывода БД в отдельном пуле потоков
У меня есть приложение Play 2.2.1, которое используетPlay-Slick 0.5.0.8 сохранять данные в бэкэнд Postgresql иSecureSocial 2.1.2 обрабатывать авторизацию пользователя.
Поскольку транзакции play-slick блокируются, я создал отдельныйslick-context
контекст исполнения в моем/conf/application.conf
файл, согласноинструкции, найденные в вики плагина:
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
Это позволяет мне создать действие контроллера, которое выполняется в отдельном контексте выполнения и не блокирует потоки в пуле потоков по умолчанию. Например./app/controllers/Application.scala
:
Пример первый - Использование DBAction от play-slick:
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'sDBAction
, Каков наилучший способ объединить два?
Я понимаю, что могу сделать что-то вроде ниже, но я понимаю, что вызов БД не будет использовать мой отдельный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
), но в идеале я хочу, чтобы пул потоков по умолчанию был достаточно экономным, и запускать все блокирующие вызовы БД в отдельном пуле.
Помощь приветствуется!