Я изучаю JPA и имею один вопрос:
В которых ситуациях нам нужен больше чем один EntityManager
в нашем приложении?
Две ситуации, что я знаю, следующие:
Когда наше приложение является многопоточным приложением, и больше чем одному потоку нужна транзакция JPA потому что EntityManager
не ориентировано на многопотоковое исполнение, и нам нужен тот EntityManager
на поток.
Когда любому потоку нужны несколько параллельных транзакций, нам нужен больше чем один EntityManager
в том потоке, потому что существуют непосредственные отношения между EntityManager
и EntityTransaction
.
Q1. Есть ли любые другие ситуации, когда нам нужен больше чем один EntityManager
?
Q2. До моего понимания должен быть только один EntityManagerFactory
на Единицу Persitence. Я корректен? В противном случае затем, каковы те ситуации, когда нам нужны несколько EntityManagerFactory
на единицу персистентности?
Q1: EntityManager
лучше всего сравнивать со «старым добрым» Hibernate Session
: единица работы (простая бизнес-действие, например, «вход в систему», «размещение заказа» и т. д.). Это не обязательно связано с одним потоком. Проблемы возникнут только в том случае, если разные потоки будут выполнять задачи БД, которые зависят друг от друга внутри одной единицы работы. Вам нужно будет выполнить их синхронно (желательно по порядку в одном потоке). Если у вас, например, есть бизнес-требование по очистке некоторых «старых журналов», когда пользователь входит в систему (что разумно не мешало бы информации друг друга), вы можете отлично выполнить это в двух отдельных потоках внутри одной единицы работы.
Q2: Вы правильно поняли. Однако вы можете создать более одного, но это не имеет никакого смысла и не дает никаких преимуществ. Это только добавит значительных накладных расходов.