Kiedy potrzebujemy więcej niż jednego Entitymanagera?

Uczę się JPA i mam jedno pytanie:

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

Dwie sytuacje, o których Wiem, są następujące:

  • Gdy nasza aplikacja jest aplikacją wielowątkową i więcej niż jeden wątek wymaga transakcji JPA, ponieważ EntityManager nie jest bezpieczny dla wątku i potrzebujemy jednego EntityManager Na wątek.

  • Gdy którykolwiek z wątków wymaga wielu jednoczesnych transakcji, potrzebujemy więcej niż jeden EntityManager w tym wątku, ponieważ istnieje relacja jeden do jednego między EntityManager a EntityTransaction.


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

Q2. Do mojego zrozumienia, powinno być tylko jeden EntityManagerFactory na jednostkę wytrwałości. Mam rację? Jeśli nie, to jakie są sytuacje, w których potrzebujemy wielokrotności EntityManagerFactory na jednostkę trwałości?

Author: Tiny, 2010-04-06

1 answers

Q1: EntityManager najlepiej porównać z" starym, dobrym "Hibernatem Session: jednostką pracy (prostą czynnością biznesową, np. "logowanie użytkownika", "składanie zamówienia", itp.). Niekoniecznie jest związany z pojedynczym wątkiem. Będziesz działał tylko w kłopotach, jeśli różne wątki wykonają zadania DB, które zależą od siebie nawzajem wewnątrz jednej jednostki pracy. Trzeba by je wykonać w synchronizacji (najlepiej, w kolejności w jednym wątku). Jeśli na przykład masz wymóg biznesowy, aby posprzątać niektóre "stare logi" kiedy użytkownik loguje się (co rozsądnie nie przeszkadzałoby sobie nawzajem w informacjach), można je doskonale wykonać w dwóch oddzielnych wątkach wewnątrz jednej jednostki pracy.

Q2: Twoje zrozumienie jest poprawne. Możesz jednak stworzyć więcej niż jeden, ale nie miałoby to żadnego sensu ani nie przyniosłoby żadnych korzyści. To tylko zwiększy koszty.
 12
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-06 17:01:22