Подтвердить что ты не робот

Разница между "jta-datasource" и "ресурсо-местным" источником данных?

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

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

Спасибо!

4b9b3361

Ответ 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 a transaction-type of RESOURCE_LOCAL предполагает, что будет предоставлен источник данных, не относящийся к JTA. В среде Java EE, если этот элемент не указан, по умолчанию используется JTA.

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

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

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