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