2012-12-14 17 views
20

Niestandardowa klasa JPA odwzorowujący ma metodę:Kiedy używać EntityManager.clear()?

removeUser() 

1. execute 'DELETE' HQL query to remove user 
2. call getEntityManager().flush(); 
3. call getEntityManager().clear(); 

Jeśli rozumiem clear() poprawnie usunie z kontekstu wszystkie uporczywe podmiotów. -source

Jednak ja również czytać here,

you should define clear architecture- and design guidelines about where a 
clear() can be called. 

Jakie są wyraźne wytyczne dotyczące kiedy zadzwonić clear()?

Odpowiedz

22

Artykuły to wyjaśniają. Wyczyszczenie menedżera encji opróżnia powiązaną pamięć podręczną, wymuszając wykonanie nowych zapytań do bazy danych w późniejszym terminie transakcji. Prawie nigdy nie jest konieczne usuwanie menedżera encji podczas używania menedżera encji związanego z transakcją. Widzę dwa powody, aby wyczyścić:

  • gdy robi przetwarzanie wsadowe, w celu uniknięcia konieczności olbrzymi cache jedzenia pamięć i zwiększając czas, aby wypłukać z powodu długich brudnych kontroli
  • kiedy robisz DML lub SQL kwerendy, które całkowicie pomijają pamięć podręczną menedżera jednostek (jak w twoim przykładzie). W tym przypadku stan przechowywany przez pamięć podręczną nie odzwierciedla zawartości bazy danych ze względu na zapytania, więc chcesz wyczyścić pamięć podręczną, aby uniknąć tej niespójności.
+0

jeśli nie jest to menedżer encji związany z transakcją, czy EM czasami się oczyści, jak na przykład wyrzucanie śmieci? –

+0

EM nie będzie oczyść się, jeśli nie oczyścisz go wyraźnie, oczywiście, jeśli nie będzie już dostępny, będzie GCed jak każdy inny obiekt –

+0

Popraw mnie jeśli się mylę, ale powiedziałbym, że trzeci powód używania 'clear' być funkcją 'tearDown' w testach, więc t hat EntityManager zawsze ma czysty stan i nie może ingerować w np. połączenie dbal – Nickolaus

5

Tak, to zależy od stylu architektury platformy jako punktów dokumentacji.

  • Na przykład, jeśli w aplikacji EM wątku związane, a następnie jeden z rozwiązania do zarządzania transakcjami jest wdrożenie wzoru Session-per-Request, który rozpoczyna transakcję na każdym starcie żądanie użytkownika i zobowiązać & jasne pamięć podręczną na każdym końcu żądania, aby zapobiec brudnym odczytom. To tylko prosty przykład.
  • Inny przykład dotyczy platformy SOA. Dla każdej usługi można również otworzyć transakcję na początku i zatwierdzić ją na końcu z rozliczeniem (w przypadku gdy ten sam EM jest używany przez inną usługę i wymagane jest unikanie brudnych odczytów)
  • Powtórzę poprzednie dwa typowe przypadki - przetwarzanie wsadowe i obejście we wszystkich możliwych przypadkach EM. W takim przypadku zapytania będą wymuszane na zapytaniach z bazy danych, a nie z pamięci podręcznej.
  • Powinieneś wiedzieć, że pracujesz z pamięcią podręczną L1 i L2, a L1 jest pamięcią podręczną wyczyszczoną przez EM. Gdy czytasz ogromny zestaw danych (w przeciwnym wypadku), wówczas wymagane jest również rozliczanie w okresie

Jak widać, zależy to od przypadków, architektury i stylu Twojej platformy. nie jest dobrą praktyką przepłukiwanie i kasowanie pamięci podręcznej dla każdej metody, jest to metoda anty-deseniowa:

Powiązane problemy