it-swarm.com.de

Persistenzeinheit als RESOURCE_LOCAL oder JTA?

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?
80
cometta

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

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-Persistenzeinheit ist. Wenn Sie also eine Transaktion wünschen, die mehrere Persistenzeinheiten (oder andere Datenbanken) umfasst, ist RESOURCE_LOCAL möglicherweise nicht gut genug.

JTA wird auch für die Verwaltung von Transaktionen zwischen Systemen wie JMS und JCA verwendet. Dies ist jedoch für die meisten von uns ziemlich exotisch.

Für die Verwendung von JTA benötigen Sie Unterstützung in Ihrem Anwendungsserver sowie Unterstützung durch den JDBC-Treiber.

90
skaffman

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 hilfreich sein kann (der Link zu der Artikel ist unten).


Vergleich von RESOURCE_LOCAL- und JTA-Persistenzkontexten


Mit <persistence-unit transaction-type = "RESOURCE_LOCAL"> [~ # ~] sind Sie [~ # ~] für EntityManager verantwortlich ( PersistenceContext/Cache) erstellen und verfolgen ...

  • Sie müssen verwenden EntityManagerFactory , um einen EntityManager zu erhalten
  • Der resultierende EntityManager Instanz ist ein PersistenceContext/Cache
  • Eine EntityManagerFactory kann über die @ PersistenceUnit Annotation nur (nicht @PersistenceContext) injiziert werden
  • Sie dürfen nicht @PersistenceContext verwenden, um auf eine Einheit vom Typ RESOURCE_LOCAL zu verweisen
  • Sie müssen müssen die EntityTransaction API verwenden, um mit dem Aufruf von bei jedem zu beginnen Ihr EntityManger
  • Wenn Sie entityManagerFactory.createEntityManager () zweimal aufrufen, werden zwei separate EntityManager-Instanzen und daher zwei separate PersistenceContexts/Caches erstellt.
  • Es ist fast nie eine gute Idee, mehr als eine Instanz eines EntityManagers im Einsatz zu haben (keine zweite erstellen) es sei denn, Sie haben die erste zerstört)


Mit <persistence-unit transaction-type = "JTA"> erledigt der [~ # ~] Container [~ # ~] EntityManager ( PersistenceContext/Cache) erstellen und verfolgen ...

  • Sie können kann nicht die EntityManagerFactory verwenden, um einen EntityManager abzurufen
  • Sie können nur einen EntityManager vom Container erhalten
  • Ein EntityManager kann über die @ PersistenceContext Annotation nur (nicht @PersistenceUnit) injiziert werden
  • Sie dürfen nicht @PersistenceUnit verwenden, um auf eine Einheit vom Typ JTA zu verweisen
  • Das vom Container angegebene EntityManager ist ein - Verweis auf den PersistenceContext/Cache, der einer JTA-Transaktion zugeordnet ist.
  • Wenn keine JTA-Transaktion ausgeführt wird, kann der EntityManager kann nicht verwendet werden , da kein PersistenceContext/Cache vorhanden ist.
  • Jeder mit einem EntityManager-Verweis auf die gleiche Einheit in der gleiche Transaktion hat automatisch einen Verweis auf die ) gleicher PersistenceContext/Cache
  • Der PersistenceContext/Cache wird flushed und zu JTA commit Zeitpunkt gelöscht

Jeder, der die Java Persistence API lernen möchte - bitte tun Sie sich selbst einen Gefallen und lesen Sie den vollständigen Artikel hier: JPA Concepts: JPA 101 .

77
informatik01

Resource_Local und JTA sind Transaktionsmanager (Methoden zur Durchführung von Transaktionen). Dies ist nicht das Eigentum der Datenbank, sondern die Komponente, die für die Koordinierung von Transaktionen verantwortlich ist. JPA- und JTA-Transaktionsmanager unterscheiden sich. Der JPA-Transaktionsmanager ist für JPA-Transaktionen verantwortlich und Sie möchten einen verwenden, wenn Sie nur eine JPA-Transaktion durchführen. Der JTA-Transaktionsmanager ist ein allgemeiner Transaktionsmanager und kann andere Ressourcen wie JMS-Warteschlangen in die Transaktion aufnehmen. In der Regel verwenden Java EE-Container einen JTA-Transaktionsmanager für EJBs, JPA-Entitäten usw. 

16
Chandra Patni

resource_local vs JTA über lokale Transaktion vs. globale Transaktion. Es geht darum, mehrere Ressourcen in einer einzigen Transaktion zu verwalten.

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

0
Jain