2010-07-10 5 views
49

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

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

Спасибо!

ответ

62

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

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

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

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

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

Первая часть правильная, последняя часть не полностью. Из спецификации EJB 3.0, раздел 13.3.4 Enterprise Beans Использования Container-Managed разграничения транзакций:

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

И раздел 16,12 UserTransaction Интерфейс:

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

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

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

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

менеджер по прикладному объекту управляемым может быть менеджером объект JTA или диспетчером объектов ресурсов локальных.

...

И JTA менеджеры сущностей и ресурсосберегающие местные менеджеры сущностей должны поддерживаться в веб-контейнерах Java EE и EJB контейнеры. В среде 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. См. this (very interesting) discussion.

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

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

+0

Hi, Большое вам спасибо за то, что нашли время и объяснили все это так ясно !!! Теперь я вижу, что мы используем термин «ресурс local EntityManager», а не «ресурс локального источника данных». Да, я имел в виду не-jta-datasource, когда я сказал «ресурс локального источника данных». Вот как я сейчас понимаю: JTA/RESOURCE_LOCAL -> Тип транзакции EntityManager. Определяет, кто контролирует базовую транзакцию. будь то API JTA/EntityTransaction JTA EntityManger: Контейнер управляет этим EntityManager. Вовлекается в транзакции JTA. Транзакция JTA может быть либо CMT, либо BMT. Может использоваться в управляемых классах. – stratwine

+0

Resource-Local EntityManager: EnityManager не управляется контейнером. Привлечение к сделкам, не связанным с JTA. Используется API EntityTransaction. Можно использовать в POJOs Для ТКМ, UserTransaction всегда использует JTA,-источник данных и не может использовать не JTA,-источник данных Аналогично для CMT тоже, контейнер может использовать только JTA,-источник данных – stratwine

+1

@stratwine: Вы можете , рад, что вы нашли его полезным (и ваше понимание выглядит правильно). Что касается формулировки, я не хотел быть придирчивым, но поскольку спецификация определяет очень точную (и тонкую) терминологию, использование этого облегчает общение, поэтому я немного настаивал на этом (и я бы рекомендовал прочитать разделы, которые я цитировал частично). –

Смежные вопросы