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

8

Ich habe eine Play 2.2.1-App, die play-slick 0.5.0.8 verwendet, um Daten in einem Postgresql-Backend zu speichern und SecureSocial 2.1.2 , um die Benutzerautorisierung durchzuführen.

Da Play-Slick-Transaktionen blockiert werden, habe ich einen separaten slick-context Ausführungskontext in meiner /conf/application.conf -Datei erstellt, wie in der Anweisungen im Wiki des Plugins gefunden :

%Vor%

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

Beispiel 1 - Verwenden von play-slicks DBAction:

%Vor%

Für bestimmte Controller-Aktionen möchte ich die SecureSocial-Aktionen ( SecuredAction , UserAwareAction usw.) in Verbindung mit play-slicks DBAction nutzen können. Was ist der beste Weg, um die beiden zu kombinieren?

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

Beispiel 2 - Verwenden der SecureSocial-Aktion:

%Vor%

Bin ich richtig davon ausgegangen, dass Beispiel zwei den Standard-Thread-Pool anstelle meines separaten slick-context -Thread-Pools verwendet / blockiert? Wenn ja, gibt es eine Möglichkeit, dies zu ändern?

Ich könnte das offensichtlich umgehen, indem ich den standardmäßigen Thread-Pool von Play stoße ( 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!

    
dbau 05.11.2013, 01:37
quelle

1 Antwort

7

Um Ihre Frage zu beantworten,

  

Bin ich richtig davon ausgegangen, dass Beispiel zwei den Standard verwendet / blockiert   Thread-Pool anstelle meines separaten Slick-Context-Thread-Pools? Wenn ja,

Ja, das würde den Standardpool verbrauchen / blockieren.

Wenn Sie den separaten slick-context -Thread-Pool verwenden möchten, könnten Sie so etwas ausprobieren?

%Vor%

Future erwartet eine ExecutionContext (eine implizite wird es tun); alles, was Sie brauchen, um den zu überliefern, den Slick (implizit) benutzt:

%Vor%     
Faiz 05.11.2013, 02:40
quelle