Обрабатывает ли jboss управляемые проблемы параллелизма Entity Manager вместо меня?

Похоже, что экземпляр Entity Manager, которым jboss управляет и предоставляет, является прокси-сервером для фактической реализации, привязанной к контексту сохранения.

Эта фактическая реализация собирает изоляцию, обеспечиваемую транзакциями JTA (для контекстов транзакций).

Это заставляет меня думать, что мне не нужно беспокоиться о проблемах параллелизма при работе с экземпляром прокси.

Может быть, я даже смогу кэшировать этот экземпляр прокси, если решу получить его из поиска JNDI вместо внедрения контейнера?

Это разумно?


person rafanoronha    schedule 22.12.2011    source источник


Ответы (1)


Контейнер отвечает за сканирование аннотаций @PersistenceContext и внедрение EntityManagers. Он может проксировать экземпляры EntityManager.

В EJB, где за внедрение зависимостей отвечает контейнер, вы можете быть уверены в потокобезопасности. Контекст персистентности будет совместно использоваться несколькими компонентами в рамках одной транзакции.

Однако, если вы внедрите этот EntityManager с помощью @PersistenceContext в среду сервлетов (где возникает проблема параллелизма), вы не потокобезопасны. Вместо этого вы должны использовать @PersistenceUnit. Вы можете обратиться к этой части Справочного руководства JBoss 7 JPA. :

Имейте в виду, что диспетчер сущностей не должен быть потокобезопасным (не вводите его в переменную класса сервлета, которая видна нескольким потокам).

Некоторое время назад я обобщил все, что мне известно о совместном использовании Persistence Context между транзакциями JTA и проксировании EntityManagers контейнером, и опубликовал его здесь. Я надеюсь, что вы найдете это полезным.

person Piotr Nowicki    schedule 22.12.2011