Play-slick com SecureSocial: Executando o IO do banco de dados em um conjunto de encadeamentos separado
Eu tenho um aplicativo Play 2.2.1 que usaplay-slick 0.5.0.8 para manter os dados em um back-end do Postgresql eSecureSocial 2.1.2 para lidar com a autorização do usuário.
Uma vez que as transações slick-play estão bloqueando, eu criei um separadoslick-context
contexto de execução na minha/conf/application.conf
arquivo, conforme oinstruções encontradas na Wiki do plugin:
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
Isso me permite criar uma Ação do controlador que seja executada em um contexto de execução separado e não bloqueie encadeamentos no conjunto de encadeamentos padrão. Por exemplo./app/controllers/Application.scala
:
Exemplo 1 - Usando o DBAction do 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)
}
}
Para determinadas ações do controlador, quero poder utilizar as Ações do SecureSocial (SecuredAction
, UserAwareAction
etc) em conjunto com o jogo-slickDBAction
. Qual é a melhor maneira de combinar os dois?
Eu percebo que posso fazer algo parecido com o abaixo, mas meu entendimento é que a chamada DB não vai usar o meu separadoslick-context
e, portanto, bloqueará o pool de threads padrão:
Exemplo Dois - Usando a Ação do 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)
}
}
Estou correto em assumir que o Exemplo Dois usará / bloqueará o conjunto de encadeamentos padrão em vez de meu bloco separadoslick-context
Grupo de discussão? Se assim for, há uma maneira de mudar isso?
Eu poderia obviamente contornar isso porsubindo o pool de threads padrão do Play (default-dispatcher
), mas o ideal é que eu queira manter o conjunto de encadeamentos padrão bastante enxuto e executar todas as chamadas de bloqueio do banco de dados em um conjunto separado.
Assistência apreciada!