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