Halten JPA EntityManager öffnen?
Ich Lerne JPA und das Allgemeine Muster in den Beispielen zu sein scheint, wie folgt:
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
//....
em.getTransaction().commit();
em.close();
Nun Frage ich mich, warum tun wir ständig erstellen und schließen EntityManagers, im Gegensatz zu halten Sie offen, und nur ab und zu neue Transaktionen? Was sind die Vorteile und Kosten der Aufbewahrung offen vs schließen Sie es die ganze Zeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beiden JPA-spezifischen Gründen in den Sinn kommen:
EntityManager ist nicht garantiert threadsicher durch die JPA spec. Daher, tragbare JPA-apps können nur eine EM in höchstens einem thread zu einem Zeitpunkt. Das idiom der Schaffung einer Methode-local-EM und schließen Sie es, bevor es geht out of scope fordert stack Einschluß von EM-Referenzen.
Einer EM mit der "Extended" - Persistenz Kontext-Lebensdauer unterhält einen einzigen Persistenz-Kontext für seine gesamte Existenz. Dies bedeutet, dass Personen automatisch stoppen abnehmen auf
commit()
. Stattdessen müssen Sie manuell getrennt, oder aber die EM ist verantwortlich für die Verfolgung.Diese Frage ist wirklich ein PPV-spezifische version des alten "wenn-pool-Objekte" - Frage. Das ist eine schwierige Frage, aber die Antwort ist vermutlich "selten".
Diese alte post developerWorks von der Java-concurrency-Experte Brian Goetz erklärt, den Punkt. Der Kern: pools machen großen Sinn für teure Objekte, wie Datenbank-verbindungen. Aber für kurzlebige, kleine und schnelle initialisieren Objekte wie EntityManager, Zusammenlegung oder einer anderen form der langfristigen Referenz-retention ist ein schwer zu verkaufen.
Aber, es ist eine Allgemeine Frage, also es gibt bestimmt Ausnahmen. Vielleicht die Anwendung ist einfach-oder Single-Threaded. Dann diese Bedenken über threadsafety werden vernichtet.
Halten Sie ein entity-manager öffnen verhindert, dass es wieder aus der Verbindung an den Verbindungspool.
Dies kann zu verschiedenen Problemen führen, insbesondere in web-Anwendungen, z.B. wenn der pool läuft vollständig und max Verbindung Größe erreicht ist, werden keine anderen Benutzer erhalten kann eine Datenbank-Verbindung zu verhindern-Datenbank-Zugriff für diesen Benutzer.
In diesem Fall ist es besser, kurz-living entity-Manager, beispielsweise das öffnen der entity-manager zu Beginn einer Anfrage und schließen Sie es am Ende einer Anfrage (kann getan werden, mit den Zuhörer/Abfangjäger..). Die Entitäten werden dann getrennt und Sie zu re-befestigen Sie, wenn Sie wollen, Sie wieder zu benutzen (mit entity-manager merge-operation).