2010-04-06 16 views
17

Uczę się JPA i mam jedno pytanie:Kiedy potrzebujemy więcej niż jednego EntityManager?

W jakich sytuacjach potrzebujemy więcej niż jednego EntityManager w naszej aplikacji?

Dwie sytuacje, że jestem świadom, są następujące:

  • Gdy nasza aplikacja jest wielowątkowych aplikacji i więcej niż jeden wątek potrzebuje transakcji WZP ponieważ EntityManager nie jest bezpieczny wątku i musimy jeden na każdy wątek: EntityManager.

  • Jeżeli którykolwiek z gwintem potrzebuje wielu jednoczesnych transakcji, musimy więcej niż jeden EntityManager w tym wątku ponieważ istnieje relacja jeden-do-jednego między EntityManager i EntityTransaction.


Q1. Czy są jakieś inne sytuacje, gdy potrzebujemy więcej niż jednego EntityManager?

Q2. Według mojego zrozumienia, na jednostkę persytencji powinna być tylko jedna jednostka: EntityManagerFactory. Mam rację? Jeśli nie, to jakie są te sytuacje, gdy potrzebujemy wielu EntityManagerFactory na jednostkę persystencji?

Odpowiedz

11

Q1: Najlepiej porównać EntityManager z "dobrym, starym" Hibernate Session: jednostką pracy (proste działanie biznesowe, np. "Logowanie użytkownika", "składanie zamówienia" itp.). Nie musi być związany z pojedynczym wątkiem. Będziesz mieć kłopoty tylko wtedy, gdy różne wątki wykonają zadania DB, które zależą od siebie w pojedynczej jednostce pracy. Będziesz musiał wykonać je zsynchronizowane (najlepiej w kolejności w jednym wątku). Jeśli na przykład masz wymóg biznesowy, aby oczyścić "stare dzienniki", gdy użytkownik się zaloguje (co rozsądnie nie przeszkadzałoby sobie nawzajem w informacjach), możesz idealnie wykonać go w dwóch osobnych wątkach wewnątrz pojedynczej jednostki pracy.

Q2: Twoje zrozumienie jest prawidłowe. Możesz jednak utworzyć więcej niż jeden, ale to nie ma sensu i nie przynosi żadnych korzyści. Doprowadziłoby to tylko do znacznego obciążenia.

+0

Dla pierwszego kwartału: domyślam się, że obiekt _Główny zarządca powinien mieć minimalny narzut, ale wciąż mam ochotę zapytać, ile narzutów :) Wow, to, że wątki diff zależą od siebie, są bardziej złożone. Czy można bezpiecznie powiedzieć, że powinieneś mieć 1 EM na wątek? Wtedy upewnisz się, że wychwycisz wszystkie wyjątki, ponieważ masz wiele wątków używających tej samej tabeli, prawda? – thirdy

+0

Tak, ponieważ program EM nie jest bezpieczny w użyciu, można go używać w wielu wątkach, jeśli utworzę wokół niego opakowanie i uwzględnię "zsynchronizowane" metody składowania/aktualizacji w opakowaniu wewnętrznie wywołującym zapis/aktualizację pliku EM. Również nigdy nie usuwam/nie zamykam EM? Myślę, że nadal mogą występować problemy z równoczesnym czytaniem i pisaniem. Czy mógłbyś dać mi znać swoje komentarze na ten temat? – bluelurker

Powiązane problemy