Похоже, что экземпляр Entity Manager, которым jboss управляет и предоставляет, является прокси-сервером для фактической реализации, привязанной к контексту сохранения.
Эта фактическая реализация собирает изоляцию, обеспечиваемую транзакциями JTA (для контекстов транзакций).
Это заставляет меня думать, что мне не нужно беспокоиться о проблемах параллелизма при работе с экземпляром прокси.
Может быть, я даже смогу кэшировать этот экземпляр прокси, если решу получить его из поиска JNDI вместо внедрения контейнера?
Это разумно?
Ответ 1 · рейтинг 3 · Piotr Nowicki
Контейнер отвечает за сканирование аннотаций @PersistenceContext и внедрение EntityManagers. Он может проксировать экземпляры EntityManager.
В EJB, где за внедрение зависимостей отвечает контейнер, вы можете быть уверены в потокобезопасности. Контекст персистентности будет совместно использоваться несколькими компонентами в рамках одной транзакции.
Однако, если вы внедрите этот EntityManager с помощью @PersistenceContext в среду сервлетов (где возникает проблема параллелизма), вы не потокобезопасны. Вместо этого вы должны использовать @PersistenceUnit. Вы можете обратиться к этой части Справочного руководства JBoss 7 JPA. :
Имейте в виду, что диспетчер сущностей не должен быть потокобезопасным (не вводите его в переменную класса сервлета, которая видна нескольким потокам).
Некоторое время назад я обобщил все, что мне известно о совместном использовании Persistence Context между транзакциями JTA и проксировании EntityManagers контейнером, и опубликовал его здесь. Я надеюсь, что вы найдете это полезным.