Ich bin ein wenig verwirrt.Play Framework 2.X und blockierende Datenbank Anruf
Vom documentation:
Play-Standard-Thread-Pool - Dies ist der Standard-Thread-Pool, in der alle Anwendungscode im Play-Framework ausgeführt wird, ohne etwas iteratees Code. Es ist ein Akka Dispatcher und kann konfiguriert werden durch Konfiguration Akka, unten beschrieben. Standardmäßig hat es einen Thread pro Prozessor.
Ist es Nutzen bringt einen blockierende Datenbank-Aufruf in einem Future
, den Anruf an die Future
wurde selbst von einem async
Controller (Rückkehr it), um eingewickelt wickeln Sie den Standardthreadpool Umgang mit anderen Benutzern zu lassen Anfragen?
Es würde nur den blockierenden Code in einem anderen Thread (von einem dedizierten ExecutionContext) verschieben, aber lassen Sie die Action
nicht blockiert.
Ich stieß auf this post, aber ich bin nicht mit der angegebenen Antwort zufrieden.
Wenn ich die Blockierung der Datenbank innerhalb des Standardthreadpools zulassen würde, würde das möglicherweise nicht verhindern, dass andere Benutzeranforderungen bearbeitet werden, die in der Zwischenzeit nicht von der Datenbank abhängen?
Hinweis: Meine Datenbank (Neo4j) hat keinen Async-Treiber.
Schöne Antwort :) In der Tat könnten engagierte Schauspieler hinter einem Router den Trick auch machen. Aber ich verstehe nicht, warum der andere Beitrag evoziert: "Sie haben nichts, um nicht zu blockieren, dann gibt es keinen Grund, Ihren Controller asynchron zu machen". Wenn ich die "ExecutionContext-Lösung" verwende, muss ich einen asynchronen Controller haben, stimmst du zu? – Mik378
'Aktion' s sind standardmäßig async. 'Action.async' ist nur eine Annehmlichkeit für den Umgang mit' Future's. Es gab zu viele Negative in der zitierten Aussage, um wirklich klar zu sein. Ich würde bei dem separaten "ExecutionContext" bleiben. –
Ja, ich weiß es. Die Wiedergabe ist zu 100% asynchron. Async ist nur ein Weg, um die Zukunft leichter zu bewältigen. Aber wenn ich die klassische 'Aktion' verwende, müsste ich den Aufruf an die Datenbank mit einer Zukunft machen, dann' Await.result' (um das Ergebnis zu erhalten), dann das Ergebnis angeben (wie 'Ok (myResult)'), da 'Action' kein' Future [Result] 'zurückgibt, sondern intern einfach eine Zukunft verwendet. Und'Await' würde blockieren. – Mik378