Условия "jta-источник-данных" и "локальный источник данных ресурса" немного неопределенны мне. Я подавляю то, что я понимаю (или предполагаю), и я хотел бы, чтобы Вы сказали, где я прав / неправильно.
Спасибо!
Термины «jta-datasource» и «resouce-local datasource» для меня немного расплывчаты.
Думаю, вы на самом деле имеете в виду элементы jta-datasource
и non-jta-datasource
. Вкратце:
jta-datasource
используется для объявления имени JNDI источника данных JTA, который будет использоваться. для получения соединений. Это обычный случай. источник не-jta-данных
должен использоваться для объявления имени JNDI данных, не относящихся к JTA. источник.
- Та же самая база данных может упоминаться как источник данных jta или как локальный источник данных ресурса
Это правильно. И я не упоминал об этом чуть выше, но некоторые провайдеры даже позволяют объявлять как jta-datasource
, так и a non-jta-datasource
и использовать их для оптимизированного чтения. через соединения, не относящиеся к JTA (т. е. они не будут связаны с текущей транзакцией JTA).
- Если упоминается как jta-datasource, то bean-компоненты / другие классы могут использовать JTA. Отсюда интерфейс UserTransaction.
Первая часть верна, последняя - не совсем. Из спецификации EJB 3.0, раздел 13.3.4 Корпоративные компоненты, использующие разграничение транзакций, управляемых контейнером :
Бизнес-методы корпоративного компонента [...] не должны пытаться получить или использовать
javax .сделка.UserTransaction
интерфейс.
И раздел 16.12 Интерфейс UserTransaction :
Контейнер не должен делать интерфейс
UserTransaction
доступным для корпоративных компонентов, которым не разрешено использовать этот интерфейс.
Другими словами, интерфейс UserTransaction
недоступен для корпоративных компонентов CMT.
- Невозможно использовать CMT / BMT, если источник данных является локальным ресурсом
Формулировка здесь немного сбивает с толку, но я бы сказал, что это не совсем правильно. Из спецификации JPA 1.0, раздел § 5.5 Управляющие транзакции :
Менеджер объекта, управляемого приложением, может быть либо менеджером объекта JTA, либо менеджером объекта локального ресурса.
...
Как менеджеры объектов JTA, так и менеджеры объектов локальных ресурсов должны поддерживаться в веб-контейнерах Java EE и контейнерах EJB. В среде EJB обычно используется менеджер объектов JTA.
И раздел 6.2.1.2 тип-транзакции
Атрибут
тип-транзакции
используется, чтобы указать, должны ли менеджеры сущностей, предоставленные фабрикой диспетчеров сущностей для единицы сохраняемости, быть сущностями JTA менеджеры или менеджеры местных ресурсов. Значение этого элемента -JTA
илиRESOURCE_LOCAL
. Тип транзакции JTA предполагает, что будет предоставлен источник данных JTA - либо как указано в элементеjta-data-source
, либо предоставлен контейнером.Как правило, в средах Java EE тип транзакциииз
RESOURCE_LOCAL
предполагает, что будет предоставлен источник данных, не относящийся к JTA. В среде Java EE, если этот элемент не указан, по умолчанию используется JTA.
Таким образом, вы МОЖЕТЕ использовать диспетчер управляемых объектов приложения , который может быть диспетчером локальных ресурсов (вы должны ввести EntityManagerFactory
, чтобы получить EM от это в этом случае), и он не будет частью транзакции JTA. См. это (очень интересное) обсуждение .
- Если упоминается как ресурс локальный источник данных, транзакции не осведомлены о JTA. Код может использовать интерфейс EntityTransaction, но не интерфейс UserTransaction
Опять же, формулировка немного сбивает с толку, но я бы сказал, что это правильно.