Jednostka trwałości jako RESOURCE_LOCAL czy JTA?

87

Mam pytania jak poniżej:

  1. Jaka jest różnica między tymi dwoma?
  2. Czy oba są obsługiwane przez wszystkie bazy danych?
  3. Czy JPA TransactionManager i JTA TransactionManager różnią się od siebie?
cometta
źródło

Odpowiedzi:

101

Implementacje JPA mają do wyboru samodzielne zarządzanie transakcjami ( RESOURCE_LOCAL) lub zarządzanie nimi przez implementację JTA serwera aplikacji.

W większości przypadków RESOURCE_LOCAL jest w porządku. Spowoduje to użycie podstawowych transakcji na poziomie JDBC. Wadą jest to, że transakcja jest lokalna dla jednostki trwałości JPA, więc jeśli chcesz, aby transakcja obejmowała wiele jednostek trwałości (lub innych baz danych), wówczas RESOURCE_LOCAL może nie być wystarczająco dobry.

JTA jest również używany do zarządzania transakcjami w różnych systemach, takich jak JMS i JCA, ale jest to dość egzotyczne użycie dla większości z nas.

Aby używać JTA, potrzebujesz obsługi go na swoim serwerze aplikacji, a także obsługi ze sterownika JDBC.

skaffman
źródło
3
wygląda na to, że glassfih nie pozwala mi korzystać z resource_local - jak mogę to zrobić?
Pete_ch
3
Na marginesie: nadal można uzyskać funkcjonalność JTA, nawet bez pełnego serwera aplikacji Java EE, korzystając z rozwiązań firm trzecich, takich jak na przykład Atomikos . Możesz więc mieć lekki kontener internetowy, taki jak Tomcat, i nadal korzystać z obsługi JTA.
informatik01
84

Jako dodatek do innych odpowiedzi

Oto fragment niezwykle przydatnego artykułu (opublikowanego na stronie Apache TomEE ), który może również pomóc odpowiedzieć na pierwsze pytanie OP (link do artykułu znajduje się poniżej).


Porównanie kontekstów trwałości RESOURCE_LOCAL i JTA


Z <persistence-unit transaction-type = "RESOURCE_LOCAL"> TY jesteś odpowiedzialny za tworzenie i śledzenie EntityManager (PersistenceContext / Cache) ...

  • Państwo musi użyć EntityManagerFactory uzyskać EntityManager
  • Wynikowe wystąpienie EntityManager to PersistenceContext / Cache
  • Obiekt EntityManagerFactory można wstrzyknąć tylko za pośrednictwem adnotacji @PersistenceUnit (nie @PersistenceContext)
  • Teraz nie wolno używać @PersistenceContext odnosić się do jednostki typu RESOURCE_LOCAL
  • Państwo musi użyć EntityTransaction API, aby rozpocząć / popełnić wokół każdego połączenia do EntityManger
  • Wywołanie entityManagerFactory.createEntityManager () dwukrotnie powoduje powstanie dwóch oddzielnych instancji EntityManager, a tym samym dwóch oddzielnych PersistenceContexts / Caches.
  • To prawie nigdy nie jest dobry pomysł, aby mieć więcej niż jedno wystąpienie danego EntityManager w użyciu (nie tworzą drugi chyba że zniszczył pierwszy)


Z <transakcji typu wytrwałość-jednostka = "JTA"> POJEMNIK zrobi EntityManager (PersistenceContext / cache) tworzenie i śledzenie ...

  • Nie można użyć EntityManagerFactory, aby uzyskać EntityManager
  • Możesz pobrać tylko EntityManager dostarczony przez kontener
  • EntityManager można wstrzykiwać przez @PersistenceContext adnotacji tylko (nie @PersistenceUnit)
  • Teraz nie wolno używać @PersistenceUnit odnosić się do jednostki typu JTA
  • EntityManager podane przez pojemnik jest odniesienie do PersistenceContext / buforze związanym z JTA transakcji.
  • Jeśli żadna transakcja JTA nie jest w toku, nie można użyć EntityManager, ponieważ nie ma PersistenceContext / Cache.
  • Każdy, kto ma odniesienie EntityManager do tej samej jednostki w tej samej transakcji , automatycznie będzie miał odniesienie do tego samego PersistenceContext / Cache
  • PersistenceContext / Cache jest zaczerwieniona i wyczyszczone w JTA popełnić czasu

Każdy zainteresowany nauką Java Persistence API - zrób sobie przysługę i przeczytaj cały artykuł tutaj: JPA Concepts: JPA 101 .

informatik01
źródło
8
Chciałem tylko dodać jeden punkt: jeśli używasz Spring, możesz użyć @ PersistenceContext i EntityManager z Resource_Local. W tym przypadku kontener Spring może zarządzać transakcją za pomocą adnotacji @ Transactional.
Sam
W moim projekcie transaction-type=RESOURCE_LOCALi @PersistenceContexti @Transactionalzarządzany przez wiosnę
Ravi Parekh
Uderzam w trójkąt skierowany w górę z powodu podanego przez Ciebie łącza.
Koray Tugay
@KorayTugay Przepraszam, nie do końca rozumiem, co mówisz, jaki trójkąt?
informatik01
1
@LinuRadu Ta odpowiedź może być pomocna: Jaki jest pożytek z session.flush () w Hibernate
informatik01
18

Resource_Local i JTA to menedżerowie transakcji (metody dokonywania transakcji). Nie jest to własność bazy danych, ale komponent odpowiedzialny za koordynację transakcji. Menedżerowie transakcji JPA i JTA są różni. Menedżer transakcji JPA jest odpowiedzialny za transakcje JPA i chcesz go użyć, jeśli wykonujesz tylko transakcję JPA. Menedżer transakcji JTA jest menedżerem transakcji ogólnego przeznaczenia i może pozyskiwać inne zasoby, takie jak kolejki JMS w transakcji. Zazwyczaj kontenery Java EE wykorzystują menedżera transakcji JTA dla EJB, jednostek JPA itp.

Chandra Patni
źródło
1

resource_local vs JTA to transakcja lokalna vs transakcja globalna. Chodzi o to, czy możemy zarządzać wieloma zasobami w ramach jednej transakcji.

CMT vs BMT chodzi o to, kto otwiera i zamyka transakcję - twórca aplikacji czy serwer aplikacji.

Pushpendra
źródło