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

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

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

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

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

Это разумно?


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


Ответы (1)


arrow_upward
3
arrow_downward

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

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

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

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

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

person Piotr Nowicki    schedule 22.12.2011