Различие между “jta-источником-данных” и “локальным для ресурса” источником данных?

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

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

Спасибо!

53
задан Manuel Drieschmanns 8 November 2017 в 05:09
поделиться

1 ответ

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

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

  • если тип транзакции единицы сохраняемости - JTA , элемент 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

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

66
ответ дан 7 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: