Одиниця стійкості як 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 ), яка також може допомогти відповісти на перше запитання OP (посилання на статтю знаходиться нижче).


Порівняння контекстів збереження RESOURCE_LOCAL та JTA


З <persistence- unitaction -type = "RESOURCE_LOCAL"> ВИ відповідаєте за створення та відстеження EntityManager (PersistenceContext / Cache) ...

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


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

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

Усім, хто зацікавлений у вивченні API стійкості Java - будь ласка, зробіть собі послугу та прочитайте повну статтю тут: Концепції JPA: JPA 101 .


8
Просто хотів додати один момент: якщо ви використовуєте Spring, ви можете використовувати @ PersistenceContext та EntityManager з Resource_Local. У цьому випадку контейнер Spring може управляти транзакцією за допомогою анотації @ Transactional.
Сем

У моєму проекті transaction-type=RESOURCE_LOCALі @PersistenceContextта @Transactionalуправляється Spring
Ravi Parekh

Я вдаряю трикутником догори через посилання, яке ви надали.
Корай Тугай,

@KorayTugay Вибачте, я не зовсім зрозумів, що ви говорите, який трикутник?
informatik01

1
@LinuRadu Ця відповідь може бути для вас корисною: Яка користь session.flush () у режимі сплячого режиму
informatik01

18

Resource_Local та JTA - це менеджери транзакцій (методи здійснення транзакцій). Це не властивість бази даних, а компонент, відповідальний за координацію транзакцій. Менеджери транзакцій JPA та JTA відрізняються. Менеджер транзакцій JPA відповідає за транзакції JPA, і ви хочете використовувати його, якщо ви виконуєте лише транзакції JPA. Менеджер транзакцій JTA - це менеджер транзакцій загального призначення, який може залучати до транзакції інші ресурси, такі як черги JMS. Зазвичай в контейнерах Java EE використовується менеджер транзакцій JTA для EJB, сутності JPA тощо.


1

resource_local проти JTA - про локальну транзакцію проти глобальної транзакції. Йдеться про те, чи можемо ми управляти кількома ресурсами за одну транзакцію.

CMT проти BMT - про те, хто відкриває та закриває транзакцію - розробник додатків або сервер додатків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.