2014-04-07 6 views
5

Von Spiel gleiche Datenbanktransaktion in separatem Thread verwenden:Wie <a href="http://www.playframework.com/documentation/2.0/ScalaAsync" rel="nofollow">documentation</a> mit Play-Framework 2.2

Aufgrund der Art und Weise 2.0 funktionieren spielen, muss der Aktionscode so schnell wie möglich sein (. Dh nicht blockierend) . Was sollen wir als Ergebnis zurückgeben, wenn wir es noch nicht generieren können? Die Antwort ist ein Versprechen des Ergebnisses!

Also ich sollte nicht Datenbankaufrufe direkt innerhalb der Aktion tun. Das verwirrt mich jetzt, wenn ich bei Plays JPA documentation aussehen:

Jeden JPA Aufruf in einer Transaktion durchgeführt werden muß, damit, JPA zu ermöglichen, für eine bestimmte Aktion, mit Anmerkungen versehen es mit @ play.db.jpa.Transactional. Diese wird Ihre Aktion-Methode mit einem PPV Aktion zusammenstellen, die für Sie

Dies lässt mich ein wenig verwirrt die Transaktion verwaltet. Wenn ich der Dokumentation folge, sollte ich einen Aktions-Thread bei einem Datenbankaufruf nicht blockieren. Aber wenn die Aktion die Datenbanktransaktion erstellt und verwaltet, verliere ich diese Transaktion nicht, indem ich die Arbeit an einen Akteur sende oder die Arbeit irgendwie in einen anderen Thread verlagern würde? Ich meine, ich bin neu in Scala und spielen, aber ich sehe einfach nicht, wie die Transaktion in separate Threads folgen würde. Hat jemand eine Erklärung, oder eine Art, dass ich das tun sollte? Ich bin sehr verwirrt.

Antwort

2

Sie sind ein Stück des Puzzles fehlt, lesen Sie unter „Highly synchron“ hier: http://www.playframework.com/documentation/2.2.x/ThreadPools

Also, ja, würden Sie wollen, dass es nicht blockierenden sein, aber wenn Sie nicht, dass wegen der JPA haben/JDBC usw. dann können Sie das Spiel so konfigurieren, wie Sie es mit den regulären Java-Webcontainern tun würden - einem Thread-Pool mit vielen Threads. Es wird dir nicht alles geben, was das Spiel geben kann, aber es könnte gut genug für dich sein.

Sie könnten auch einen bestimmten Thread-Pool/Ausführungskontext erstellen und die JPA/JDBC-Daten nur darauf ausführen und den Rest Ihres Servers nicht blockieren.

+0

Ich sehe. Vielen Dank. – spierce7

+0

Ich mag Ihren zweiten Vorschlag, Pool/Ausführungskontext für JPA/JDBC zu haben. Wären Sie in der Lage, Ihre Antwort mit Code zu erweitern, wie geht das? –

Verwandte Themen