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

87

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

  1. В чем разница между этими двумя?
  2. Оба ли они поддерживаются всеми базами данных?
  3. Отличаются ли JPA TransactionManager и JTA TransactionManager?
комета
источник

Ответы:

101

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

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

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

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

Скаффман
источник
3
кажется, что glassfih не позволяет мне использовать resource_local - как я могу это сделать?
Pete_ch
3
В качестве примечания: можно получить функциональность JTA даже без полноценного сервера приложений Java EE, используя сторонние решения, такие как, например, Atomikos . Таким образом, у вас может быть легкий веб-контейнер, такой как Tomcat, и при этом поддержка JTA.
informatik01
84

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

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


Сравнение контекстов сохранения RESOURCE_LOCAL и JTA


С помощью <persistence-unit transaction-type = "RESOURCE_LOCAL"> ВЫ несете ответственность за создание и отслеживание EntityManager (PersistenceContext / Cache) ...

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


С <живучесть блока транзакций типа = «ССТ»> КОНТЕЙНЕР будет делать EntityManager (PersistenceContext / Cache) создание и отслеживание ...

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

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

informatik01
источник
8
Просто хотел добавить один момент: если вы используете Spring, вы можете использовать @ PersistenceContext и EntityManager с Resource_Local. В этом случае контейнер Spring может управлять транзакцией с помощью аннотации @ Transactional.
Сэм,
В моем проекте transaction-type=RESOURCE_LOCALи @PersistenceContextи @Transactionalуправляется Spring
Ravi Parekh
Я нажимаю на треугольник вверх из-за предоставленной вами ссылки.
Корай Тугай
@KorayTugay Извините, не совсем понял, что вы говорите, какой треугольник?
informatik01
1
@LinuRadu. Этот ответ может быть вам полезен: какова польза от session.flush () в Hibernate
informatik01
18

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

Чандра Патни
источник
1

resource_local против JTA - это локальная транзакция и глобальная транзакция. Речь идет о том, можем ли мы управлять несколькими ресурсами в рамках одной транзакции.

CMT против BMT - это о том, кто открывает и закрывает транзакцию - разработчик приложения или сервер приложений.

Пушпендра
источник