2010-04-06 10 views
17

Ich lerne JPA und habe eine Frage:Wann brauchen wir mehr als einen EntityManager?

In welchen Situationen brauchen wir mehr als eine EntityManager in unserer Anwendung?

Die beiden Situationen, die ich kenne, sind wie folgt:

  • Wenn unsere Anwendung ist ein Multi-Threaded-Anwendung und mehr als ein Thread benötigt JPA Transaktion weil EntityManager ist nicht Thread-sicher und wir brauchen ein EntityManager pro Thread.

  • Wenn eine der Thread mehrere gleichzeitige Transaktionen benötigt, brauchen wir mehr als eine EntityManager in diesem Thread, weil es eine Eins-zu-Eins-Beziehung zwischen EntityManager und EntityTransaction ist.


Q1. Gibt es noch andere Situationen, in denen wir mehr als eine EntityManager benötigen?

Q2. Bis zu meinem Verständnis sollte es nur eine EntityManagerFactory pro Persistenzeinheit geben. Hab ich recht? Wenn nicht, was sind dann die Situationen, in denen wir mehrere EntityManagerFactory pro Persistenzeinheit benötigen?

Antwort

11

Q1: Die EntityManager ist am besten mit dem "guten alten" Hibernate Session zu vergleichen: eine Arbeitseinheit (eine einfache Geschäftsaktion, z. Es ist nicht notwendigerweise an einen einzelnen Thread gebunden. Sie werden nur in Schwierigkeiten geraten, wenn die verschiedenen Threads DB-Tasks ausführen, die innerhalb einer einzelnen Arbeitseinheit voneinander abhängen. Sie müssten sie synchron ausführen (vorzugsweise in der Reihenfolge eines einzelnen Threads). Wenn Sie zum Beispiel die Geschäftsanforderung haben, einige "alte Protokolle" zu bereinigen, wenn sich ein Benutzer anmeldet (was die Informationen des anderen nicht stören würde), können Sie ihn perfekt in zwei separaten Threads innerhalb einer einzigen Arbeitseinheit ausführen.

Q2: Ihr Verständnis ist richtig. Sie können jedoch mehrere erstellen, aber das würde keinen Sinn machen und keinen Nutzen haben. Es würde nur einen erheblichen Overhead hinzufügen.

+0

Für Q1: Ich denke ein _Entity Manager_ Objekt sollte minimale Overhead haben, aber ich jucke immer noch fragen, wie viel Aufwand :) Wow, diese Diff-Threads, die voneinander abhängen, ist komplexer. Also ist es sicher zu sagen, dass Sie 1 EM pro Thread haben sollten? Dann stellen Sie sicher, dass Sie irgendwelche Ausnahmen abfangen, da Sie mehrere Threads mit der gleichen Tabelle haben, richtig? – thirdy

+0

Ja, da EM nicht threadsicher ist, kann es über mehrere Threads hinweg verwendet werden, wenn ich einen Wrapper darum erstelle und 'synchronisierte' Speicher-/Aktualisierungsmethoden in den Wrapper einschließe, die intern das Speichern/Aktualisieren von EM aufrufen. Ich lösche auch niemals die EM? Ich denke, es kann immer noch Probleme beim gleichzeitigen Lesen und Schreiben geben. Könnten Sie mir bitte Ihre diesbezüglichen Kommentare mitteilen? – bluelurker

Verwandte Themen