2013-04-22 14 views

Antwort

8

Ich würde empfehlen, einen neuen EntityManager pro Transaktion zu erstellen. So wurde JPA entworfen. Der EntityManager sollte kein zu erstellendes teures Objekt sein. (Die EntityManagerFactory ist jedoch sehr teuer, also stellen Sie sicher, dass Sie nur eine davon haben).

+1

Bei Verwendung des ersten Ansatzes ist EntityManager manchmal nicht synchronisiert, da 'ThreadLocal' für jeden Thread einen neuen EntityManager erzeugt. Ich habe nur eine Wahl: einen neuen EntityManager pro Transaktion zu erstellen. – user2198754

+1

James Sutherland empfiehlt die Wiederverwendung von EntityManager während der Anfrage. Der Hauptgrund ist die Persistenzkontextfreigabe. Stimmst du dem zu? http://www.codeanch.com/t/550734/ORM/databases/Practice-EntityManager – okwap

0

Der Link von okwap ist sehr hilfreich. Um sicherzustellen, dass es nicht durchrutschen, und den Board-Regeln zu folgen, habe ich eine Kopie hier:

 
- an EntityManager contains a persistence context, that will track 
    everything read through it, so to avoid bloated memory, you should 
    acquire a new one, or clear it at some point 
- if you read the same object through two different EntityManager you 
    will get different objects back, so will loose object identity, which 
    is something to consider 

Auf dieser Grundlage werde ich hinzufügen, dass geben kann sogar Objekte mit unterschiedlichen Inhalten durch zwei verschiedene EntityManager lesen , wenn in der Zwischenzeit eine Datenbanktransaktion von jemand anderem ausgeführt wurde. Wenn Sie jedoch wiederholt durch denselben EntityManager lesen, wird der zweite Lesevorgang das Objekt nur aus dem Cache des EntityManagers holen, so dass der neuere Status einfach nicht sichtbar ist.

Verwandte Themen