play-slick 0.5.0.8を使用してデータを Postgresql バックエンドに保持し、 SecureSocial 2.1.2を使用してユーザー認証を処理する Play 2.2.1 アプリがあります。
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
:
例 1 - 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)
}
}
SecuredAction
特定のコントローラー アクションについては、 SecureSocial のアクション (UserAwareAction
など) を play-slick の と組み合わせて利用できるようにしたいと考えていますDBAction
。2つを組み合わせる最良の方法は何ですか?
私は以下のようなことができることを理解していますが、私の理解では、DB 呼び出しは私のセパレートslick-context
を使用しないため、デフォルトのスレッド プールをブロックします。
例 2 - 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)
}
}
例 2 では、個別のスレッド プールの代わりにデフォルトのスレッド プールを使用/ブロックすると想定するのは正しいslick-context
ですか? もしそうなら、これを変更する方法はありますか?
もちろん、 Play のデフォルト スレッド プール( ) を増やすことでこれを回避できますdefault-dispatcher
が、理想的には、デフォルト スレッド プールを非常に無駄のない状態に保ち、すべてのブロッキング DB 呼び出しを別のプールで実行したいと考えています。
よろしくお願いします!