Play-Slick mit SecureSocial: Ausführen von DB IO in einem separaten Thread-Pool

Ich habe eine Play 2.2.1-App, die verwendet wirdPlay-Slick 0.5.0.8 um Daten in einem Postgresql-Backend zu speichern undSecureSocial 2.1.2 Benutzerberechtigung zu behandeln.

Da Play-Slick-Transaktionen blockieren, habe ich eine separate erstelltslick-context Ausführungskontext in meinem/conf/application.conf Datei gemäß derAnweisungen finden Sie im Wiki des Plugins:

play {
  akka {
    actor {
      slick-context = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300
        }
      }
    }
  }
}

Auf diese Weise kann ich eine Controller-Aktion erstellen, die in einem separaten Ausführungskontext ausgeführt wird und keine Threads im Standard-Thread-Pool blockiert. Z.B./app/controllers/Application.scala:

Beispiel Eins - Verwenden der DBAction von 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)
  }

}

Für bestimmte Controller-Aktionen möchte ich die Aktionen von SecureSocial verwenden können (SecuredAction, UserAwareAction etc) in Verbindung mit Play-SlicksDBAction. Wie lässt sich beides am besten kombinieren?

Mir ist klar, dass ich so etwas wie das Folgende tun kann, aber ich verstehe, dass der DB-Aufruf mein separates nicht verwendetslick-context und blockiert daher den Standard-Thread-Pool:

Beispiel 2 - Verwenden der Aktion von 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)
  }

}

Bin ich richtig in der Annahme, dass Beispiel zwei den Standard-Thread-Pool anstelle meines separaten verwendet / blockiertslick-context Thread-Pool? Wenn ja, gibt es eine Möglichkeit, dies zu ändern?

Ich könnte das natürlich umgehenDen Standard-Thread-Pool von Play hochfahren (default-dispatcher), aber im Idealfall möchte ich den Standard-Thread-Pool ziemlich schlank halten und alle blockierenden DB-Aufrufe in einem separaten Pool ausführen.

Hilfe geschätzt!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage