Разница между «источником данных jta» и «локальным ресурсом»? - PullRequest
53 голосов
/ 10 июля 2010

Термины "jta-datasource" и "resource-local datasource" для меня немного расплывчаты. Я записываю то, что понимаю (или предполагаю), и я бы хотел, чтобы вы сказали, где я прав / не прав.

  • Эта же база данных может называться источником данных jta или локальным источником данных ресурса.
  • Если упомянуто как jta-datasource, то бины / другие классы могут использовать JTA. Следовательно, интерфейс UserTransaction
  • Невозможно использовать CMT / BMT , если источником данных является локальный ресурс
  • Если упомянуто как локальный источник данных, транзакции не поддерживаются JTA. Код может использовать интерфейс EntityTransaction, но не интерфейс UserTransaction

Спасибо!

1 Ответ

66 голосов
/ 10 июля 2010

Термины "jta-datasource" и "resouce-local datasource" для меня немного расплывчаты.

Полагаю, вы действительно ссылаетесь на jta-datasource и non-jta-datasourceэлементы.Вкратце:

  • , если тип транзакции единицы постоянства равен JTA , элемент jta-datasource используется для объявления имени JNDI источника данных JTA, который будет использоватьсяполучить соединения.Это общий случай.
  • , если тип транзакции единицы персистентности resource-local , non-jta-data-source следует использовать для объявления имени JNDI не-JTA источника данных.
  • Эта же база данных может называться источником данных jta или локальным источником данных ресурса

Это правильно.И я не упомянул об этом чуть выше, но некоторые провайдеры даже позволяют объявлять и jta-datasource и a non-jta-datasource и использовать последнее для оптимизированного чтения через соединения не-JTA (то есть это не будетбыть связанным с текущей транзакцией JTA).

  • Если упомянуто как источник данных jta, то бины / другие классы могут использовать JTA.Следовательно, интерфейс UserTransaction.

Первая часть верна, последняя часть не совсем.Из спецификации EJB 3.0, раздел 13.3.4. Корпоративные компоненты, использующие демаркацию транзакций, управляемых контейнером :

Бизнес-методы корпоративного компонента [...] не должны пытаться получить илииспользуйте интерфейс javax.transaction.UserTransaction.

И раздел 16.12 Интерфейс UserTransaction :

Контейнер не должен делать интерфейс UserTransaction доступным длякорпоративные бины, которым не разрешено использовать этот интерфейс.

Другими словами, интерфейс UserTransaction недоступен для корпоративных компонентов CMT.

  • Невозможно использовать CMT / BMT, если источником данных является ресурс локальный

Формулировка здесь немного сбивает с толку, но я бы сказал, что это не совсем правильно.Из спецификации JPA 1.0, раздел § 5.5. Управление транзакциями :

Управляемый приложением менеджер сущностей может быть либо администратором сущностей JTA, либо менеджером сущностей локального ресурса.

...

В веб-контейнерах Java EE и EJB-контейнерах должны поддерживаться как менеджеры сущностей JTA, так и менеджеры локальных ресурсов.В среде EJB обычно используется менеджер сущностей JTA.

И , раздел 6.2.1.2 тип транзакции

Атрибут transaction-typeиспользуется для указания того, должны ли менеджеры сущностей, предоставляемые фабрикой менеджеров сущностей для модуля персистентности, быть менеджерами сущностей JTA или локальными менеджерами сущностей ресурсов.Значение этого элемента JTA или RESOURCE_LOCAL.Тип транзакции JTA предполагает, что будет предоставлен источник данных JTA - либо, как указано в элементе jta-data-source, так и в контейнере.Как правило, в средах Java EE transaction-type из RESOURCE_LOCAL предполагает, что будет предоставлен источник данных, отличный от JTA.В среде Java EE, если этот элемент не указан, по умолчанию используется JTA.

Таким образом, вы МОЖЕТЕ использовать менеджер управляемых сущностей приложений , который может быть локально-ресурсным менеджером сущностей (вы должны ввести EntityManagerFactory, чтобы получитьEM от этого в этом случае), и это не будет частью транзакции JTA.См. это (очень интересное) обсуждение .

  • Если упомянуто как источник локального источника данных, транзакции не поддерживаются JTA.Код может использовать интерфейс EntityTransaction, но не интерфейс UserTransaction

Опять же, формулировка немного сбивает с толку, но я бы сказал, что это правильно.

...