2013-04-22 16 views
6

W moim przypadku aplikacji udało transakcji mam wybierać między:Ponowne użycie menedżera encji przez em.clear() lub utworzenie nowego menedżera encji?

  1. Korzystanie pojedynczą EntityManager i nazywając clear() przed każdym nowym transakcji. Udostępnij EntityManager przy użyciu ThreadLocal.
  2. Tworzenie nowej EntityManager dla każdej transakcji.

Nie mam dużego doświadczenia w JPA. Moje pytanie brzmi, który z nich jest lepszy pod względem wydajności?

Odpowiedz

8

Polecam utworzenie nowego EntityManager dla każdej transakcji. W ten sposób zaprojektowano JPA. EntityManager nie powinien być drogim obiektem do stworzenia. (EntityManagerFactory jest bardzo drogi, więc upewnij się, że masz tylko jedną z nich).

+1

Podczas korzystania z pierwszego podejścia, czasami EntityManager nie jest w "sync", ponieważ "ThreadLocal" spowoduje utworzenie nowego EntityManager dla każdego wątku. Zostawiłem tylko jeden wybór: stworzyć nowy EntityManager dla każdej transakcji. – user2198754

+1

James Sutherland zaleca ponowne użycie EntityManager podczas żądania. Głównym powodem jest udostępnianie kontekstu trwałości. Czy zgadzasz się z tym? http://www.coderanch.com/t/550734/ORM/databases/Practise-EntityManager – okwap

0

Link dostarczany przez okwap jest bardzo pomocny. Aby upewnić się, że nie będzie przemknąć i przestrzegać zasad planszowe, umieścić kopię tutaj:

 
- 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 

oparciu o które, dodam, że czytanie przez dwa różne EntityManager może nawet dać obiektów o różnej zawartości , jeśli transakcja bazy danych została wykonana przez kogoś innego w międzyczasie. Ale jeśli czytasz wielokrotnie przez tego samego podmiotu, drugi czytam, po prostu dostaję objet z pamięci podręcznej ciułaczy, więc nowszy stan będzie po prostu niewidoczny.

Powiązane problemy