Persistenz-Einheit als RESOURCE_LOCAL oder JTA?


86

Ich habe Fragen wie folgt:

  1. Was ist der Unterschied zwischen diesen beiden?
  2. Werden beide von allen Datenbanken unterstützt?
  3. Unterscheiden sich JPA TransactionManager und JTA TransactionManager?

Antworten:


100

JPA-Implementierungen haben die Wahl, Transaktionen selbst zu verwalten ( RESOURCE_LOCAL) oder von der JTA-Implementierung des Anwendungsservers verwalten zu lassen.

In den meisten Fällen ist RESOURCE_LOCAL in Ordnung. Dies würde grundlegende Transaktionen auf JDBC-Ebene verwenden. Der Nachteil ist, dass die Transaktion lokal für die JPA-Persistenz-Einheit ist. Wenn Sie also eine Transaktion wünschen, die mehrere Persistenz-Einheiten (oder andere Datenbanken) umfasst, ist RESOURCE_LOCAL möglicherweise nicht gut genug.

JTA wird auch zum Verwalten von Transaktionen zwischen Systemen wie JMS und JCA verwendet, aber das ist für die meisten von uns eine ziemlich exotische Verwendung.

Um JTA verwenden zu können, benötigen Sie Unterstützung auf Ihrem Anwendungsserver sowie Unterstützung vom JDBC-Treiber.


3
es scheint, dass glassfih mir nicht erlaubt, resource_local zu verwenden - wie kann ich das tun?
Pete_ch

3
Als Randbemerkung: man kann noch JTA Funktionalität bekommen, auch ohne eine vollständige Server - Anwendung Java EE von Lösungen von Drittanbietern verwenden, wie zum Beispiel Atomikos . So können Sie einen leichten Webcontainer wie Tomcat haben und trotzdem die JTA-Unterstützung erhalten.
informatik01

83

Als Ergänzung zu anderen Antworten

Hier ist ein Auszug aus dem äußerst nützlichen Artikel (veröffentlicht auf der Apache TomEE- Website), der auch bei der Beantwortung der ersten Frage des OP helfen kann (der Link zum Artikel befindet sich unten).


Vergleichen der Persistenzkontexte RESOURCE_LOCAL und JTA


Mit <persistence-unit transaction-type = "RESOURCE_LOCAL"> sind SIE für die Erstellung und Verfolgung von EntityManager (PersistenceContext / Cache) verantwortlich ...

  • Sie müssen die EntityManagerFactory verwenden , um einen EntityManager abzurufen
  • Die resultierende EntityManager- Instanz ist ein PersistenceContext / Cache
  • Eine EntityManagerFactory kann nur über die Annotation @PersistenceUnit eingefügt werden (nicht über @PersistenceContext).
  • Sie dürfen @PersistenceContext nicht verwenden, um auf eine Einheit vom Typ RESOURCE_LOCAL zu verweisen
  • Sie müssen die EntityTransaction- API verwenden, um jeden Aufruf Ihres EntityManger zu starten / festzuschreiben
  • Das zweimalige Aufrufen von entityManagerFactory.createEntityManager () führt zu zwei separaten EntityManager-Instanzen und damit zu zwei separaten PersistenceContexts / Caches.
  • Es ist fast nie eine gute Idee, mehr als eine Instanz eines EntityManager zu verwenden (erstellen Sie keine zweite, es sei denn, Sie haben die erste zerstört).


Mit <persistence-unit transaction-type = "JTA"> erstellt und verfolgt der CONTAINER den EntityManager (PersistenceContext / Cache) ...

  • Sie können die EntityManagerFactory nicht verwenden , um einen EntityManager abzurufen
  • Sie können nur einen EntityManager erhalten, der vom Container bereitgestellt wird
  • Ein EntityManager kann nur über die Annotation @PersistenceContext eingefügt werden (nicht über @PersistenceUnit).
  • Sie dürfen @PersistenceUnit nicht verwenden, um auf eine Einheit vom Typ JTA zu verweisen
  • Der vom Container angegebene EntityManager verweist auf den PersistenceContext / Cache, der einer JTA-Transaktion zugeordnet ist.
  • Wenn keine JTA-Transaktion ausgeführt wird, kann der EntityManager nicht verwendet werden, da kein PersistenceContext / Cache vorhanden ist.
  • Jeder Benutzer mit einem EntityManager-Verweis auf dieselbe Einheit in derselben Transaktion hat automatisch einen Verweis auf denselben PersistenceContext / Cache
  • Der PersistenceContext / Cache wird zum Zeitpunkt der JTA- Festschreibung geleert und gelöscht

Wenn Sie die Java Persistence API lernen möchten, tun Sie sich selbst einen Gefallen und lesen Sie den vollständigen Artikel hier: JPA-Konzepte: JPA 101 .


8
Ich wollte nur einen Punkt hinzufügen: Wenn Sie Spring verwenden, können Sie @ PersistenceContext und EntityManager mit Resource_Local verwenden. In diesem Fall kann der Spring-Container die Transaktion mithilfe der Annotation @ Transactional verwalten.
Sam

In meinem Projekt transaction-type=RESOURCE_LOCALund @PersistenceContextund @Transactionalverwaltet von Spring
Ravi Parekh

Ich treffe das Dreieck mit der Vorderseite nach oben, weil Sie einen Link angegeben haben.
Koray Tugay

@KorayTugay Es tut mir leid, habe nicht ganz verstanden, was du sagst, welches Dreieck?
informatik01

1
@LinuRadu Diese Antwort könnte für Sie hilfreich sein: Was nützt session.flush () im Ruhezustand
informatik01

18

Resource_Local und JTA sind Transaktionsmanager (Methoden zum Ausführen von Transaktionen). Dies ist nicht die Eigenschaft der Datenbank, sondern die Komponente, die für die Koordination von Transaktionen verantwortlich ist. JPA- und JTA-Transaktionsmanager sind unterschiedlich. Der JPA-Transaktionsmanager ist für JPA-Transaktionen verantwortlich und Sie möchten eine verwenden, wenn Sie nur eine JPA-Transaktion ausführen. Der JTA-Transaktionsmanager ist ein Allzweck-Transaktionsmanager und kann andere Ressourcen wie JMS-Warteschlangen in die Transaktion einbeziehen. In der Regel verwenden Java EE-Container einen JTA-Transaktionsmanager für EJBs, JPA-Entitäten usw.


1

resource_local vs JTA geht es um lokale Transaktion vs globale Transaktion. Es geht darum, wie wir mehrere Ressourcen unter einer einzigen Transaktion verwalten können.

Bei CMT vs BMT geht es darum, wer die Transaktion öffnet und schließt - Anwendungsentwickler oder Anwendungsserver.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.