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

Единица сохранения как RESOURCE_LOCAL или JTA?

У меня есть запросы, как показано ниже:

  • В чем разница этих двух?
  • Оба из них поддерживаются всеми базами данных?
  • Являются ли разные транзакторы JPA TransactionManager и JTA TransactionManager?
4b9b3361

Ответ 1

В реализациях JPA есть выбор для управления транзакциями (RESOURCE_LOCAL) или с их управлением реализацией JTA сервера приложений.

В большинстве случаев RESOURCE_LOCAL в порядке. Это будет использовать основные транзакции на уровне JDBC. Недостатком является то, что транзакция является локальной единицей сохранения JPA, поэтому, если вы хотите, чтобы транзакция охватывала несколько единиц сохранения (или другие базы данных), тогда RESOURCE_LOCAL может быть недостаточно.

JTA также используется для управления транзакциями через такие системы, как JMS и JCA, но это довольно экзотическое использование для большинства из нас.

Чтобы использовать JTA, вам нужна поддержка на сервере приложений, а также поддержка драйвера JDBC.

Ответ 2

В дополнение к другим ответам

Вот фрагмент из чрезвычайно полезной статьи (опубликованной на веб-сайте Apache TomEE), который также может помочь ответить на первый вопрос OP вопрос (ссылка на статью ниже).


Сравнение RESOURCE_LOCAL и JTA persistence контексты


С единицей сохранения Сделка типа = "RESOURCE_LOCAL" > YOU отвечают за EntityManager (PersistenceContext/Cache) создания и отслеживания...

  • Вы должны использовать EntityManagerFactory, чтобы получить EntityManager
  • Результат EntityManager -. PersistenceContext/Cache
  • EntityManagerFactory можно вводить через @PersistenceUnit только аннотация (не @PersistenceContext)
  • Вам разрешено неиспользуйте @PersistenceContext для ссылки на единицу типа RESOURCE_LOCAL
  • Вы должны использовать API EntityTransaction для начала/фиксации каждый вызов вашего EntityManger
  • Вызов entityManagerFactory.createEntityManager() дважды приводит к два отдельных экземпляра EntityManager и поэтому два отдельных PersistenceContexts/Caches.
  • Это почти никогда хорошая идея иметь более одного экземпляр используемого EntityManager (не создавайте второй, если вы не уничтожили первый)


С единицей сохранения Сделка типа = "ССТ" > КОНТЕЙНЕР сделает EntityManager (PersistenceContext/Cache) создания и отслеживания...

  • Вы не можете использовать EntityManagerFactory, чтобы получить EntityManager
  • Вы можете получить EntityManager, предоставленный контейнер
  • EntityManagerмогут быть введены через @PersistenceContextтолько аннотация (не @PersistenceUnit)
  • Вы не разрешено использовать @PersistenceUnit для ссылки на единица типа JTA
  • EntityManager, заданный контейнер является ссылкой для PersistenceContext/Cache, связанный с транзакцией JTA.
  • Если транзакция JTA не выполняется, EntityManager нельзя использовать, потому что нет PersistenceContext/Cache.
  • Каждый, у кого есть EntityManager ссылку на ту же единицу в транзакция будет автоматически ссылаться на тот же PersistenceContext/Cache
  • PersistenceContext/Cache flushed и очищается на JTA совершить время

Любой, кто заинтересован в изучении Java Persistence API, прошу вас, сделайте себе одолжение и прочитайте полную статью здесь: JPA Concepts: JPA 101.

Ответ 3

Resource_Local и JTA - это менеджеры транзакций (методы совершения транзакций). Это не свойство базы данных, а компонент, ответственный за координацию транзакций. Менеджеры транзакций JPA и JTA отличаются. Менеджер транзакций JPA отвечает за транзакции JPA, и вы хотите использовать их, если вы делаете только транзакцию JPA. Диспетчер транзакций JTA является менеджером транзакций общего назначения и может привлекать другие ресурсы, такие как очереди JMS в транзакции. Обычно контейнеры Java EE используют диспетчер транзакций JTA для EJB, объектов JPA и т.д.