Когда нам нужно более одного EntityManager? - PullRequest
18 голосов
/ 06 апреля 2010

Я изучаю JPA и у меня есть один вопрос:

В каких ситуациях нам нужно более одного EntityManager в нашем приложении?

Мне известны две ситуации:

  • Когда наше приложение является многопоточным приложением, и более чем одному потоку требуется транзакция JPA, поскольку EntityManager не является поточно-ориентированным, и нам необходим один EntityManager на поток.

  • Когда любому потоку требуется несколько одновременных транзакций, нам нужно более одного EntityManager в этом потоке, поскольку между EntityManager и EntityTransaction.

    * 1020 существует отношение один к одному *

Q1. Есть ли другие ситуации, когда нам нужно более одного EntityManager?

Q2. Насколько я понимаю, должен быть только один EntityManagerFactory на единицу сопротивления. Я прав? Если нет, то каковы те ситуации, когда нам нужно несколько EntityManagerFactory на единицу персистентности?

1 Ответ

11 голосов
/ 06 апреля 2010

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

Q2: Ваше понимание верно. Тем не менее, вы можете создать более одного, но это не имеет никакого смысла и не принесет никаких преимуществ. Это только добавило бы значительные накладные расходы.

...