Unité de persistance comme RESOURCE_LOCAL ou JTA?


87

J'ai des questions comme ci-dessous:

  1. Quelle est la différence entre ces deux?
  2. Ces deux éléments sont-ils pris en charge par toutes les bases de données?
  3. JPA TransactionManager et JTA TransactionManager sont-ils différents?

Réponses:


101

Les implémentations JPA ont le choix de gérer elles-mêmes les transactions ( RESOURCE_LOCAL) ou de les faire gérer par l'implémentation JTA du serveur d'applications.

Dans la plupart des cas, RESOURCE_LOCAL convient. Cela utiliserait des transactions de base au niveau JDBC. L'inconvénient est que la transaction est locale à l'unité de persistance JPA, donc si vous voulez une transaction qui couvre plusieurs unités de persistance (ou d'autres bases de données), alors RESOURCE_LOCAL peut ne pas être assez bon.

JTA est également utilisé pour gérer les transactions sur des systèmes tels que JMS et JCA, mais c'est un usage assez exotique pour la plupart d'entre nous.

Pour utiliser JTA, vous devez le prendre en charge dans votre serveur d'applications, ainsi que le support du pilote JDBC.


3
il semble que glassfih ne me permette pas d'utiliser resource_local - comment puis-je faire cela?
Pete_ch

3
En remarque: on peut toujours obtenir la fonctionnalité JTA, même sans serveur d'applications Java EE complet, en utilisant des solutions tierces, comme par exemple Atomikos . Vous pouvez donc avoir un conteneur Web léger comme Tomcat tout en bénéficiant du support JTA.
informatik01

84

En complément d'autres réponses

Voici un extrait de l'article extrêmement utile (publié sur le site Apache TomEE ), qui peut également aider à répondre à la première question de l'OP (le lien vers l'article est ci-dessous).


Comparaison des contextes de persistance RESOURCE_LOCAL et JTA


Avec <persistence-unit transaction-type = "RESOURCE_LOCAL"> VOUS êtes responsable de la création et du suivi d'EntityManager (PersistenceContext / Cache) ...

  • Vous devez utiliser EntityManagerFactory pour obtenir un EntityManager
  • L' instance EntityManager résultante est un PersistenceContext / Cache
  • Un EntityManagerFactory peut être injecté via l' annotation @PersistenceUnit uniquement (pas @PersistenceContext)
  • Vous n'êtes pas autorisé à utiliser @PersistenceContext pour faire référence à une unité de type RESOURCE_LOCAL
  • Vous devez utiliser l' API EntityTransaction pour commencer / valider chaque appel à votre EntityManger
  • L'appel double de entityManagerFactory.createEntityManager () donne deux instances EntityManager distinctes et donc deux PersistenceContexts / Caches séparés.
  • Ce n'est presque jamais une bonne idée d'avoir plus d'une instance d'un EntityManager en cours d'utilisation (ne créez pas une seconde à moins d'avoir détruit la première)


Avec <persistence-unit transaction-type = "JTA"> le CONTAINER effectuera la création et le suivi d'EntityManager (PersistenceContext / Cache) ...

  • Vous ne pouvez pas utiliser EntityManagerFactory pour obtenir un EntityManager
  • Vous ne pouvez obtenir qu'un EntityManager fourni par le conteneur
  • Un EntityManager peut être injecté via l' annotation @PersistenceContext uniquement (pas @PersistenceUnit)
  • Vous n'êtes pas autorisé à utiliser @PersistenceUnit pour faire référence à une unité de type JTA
  • L' EntityManager donné par le conteneur est une référence au PersistenceContext / Cache associé à une transaction JTA.
  • Si aucune transaction JTA n'est en cours, EntityManager ne peut pas être utilisé car il n'y a pas de PersistenceContext / Cache.
  • Toute personne ayant une référence EntityManager à la même unité dans la même transaction aura automatiquement une référence au même PersistenceContext / Cache
  • Le PersistenceContext / Cache est rincé et effacé à JTA engager le temps

Toute personne intéressée par l'API Java Persistence - rendez-vous service et lisez l'article complet ici: Concepts JPA: JPA 101 .


8
Je voulais juste ajouter un point: si vous utilisez Spring, vous pouvez utiliser @ PersistenceContext et EntityManager avec Resource_Local. Dans ce cas, le conteneur Spring peut gérer la transaction à l'aide de l'annotation @ Transactional.
Sam

Dans mon projet transaction-type=RESOURCE_LOCALet @PersistenceContextet @Transactionalgéré par Spring
Ravi Parekh

Je frappe le triangle vers le haut à cause du lien que vous avez fourni.
Koray Tugay

@KorayTugay Je suis désolé, je n'ai pas bien compris ce que vous dites, quel triangle?
informatik01

1
@LinuRadu Cette réponse pourrait vous être utile: Quelle est l'utilité de session.flush () dans Hibernate
informatik01

18

Resource_Local et JTA sont des gestionnaires de transactions (méthodes de transactions). Ce n'est pas la propriété de la base de données mais le composant chargé de coordonner les transactions. Les gestionnaires de transactions JPA et JTA sont différents. Le gestionnaire de transactions JPA est responsable des transactions JPA et vous souhaitez en utiliser une si vous ne faites que des transactions JPA. Le gestionnaire de transactions JTA est un gestionnaire de transactions à usage général et peut enrôler d'autres ressources telles que les files d'attente JMS dans la transaction. Généralement, les conteneurs Java EE utilisent un gestionnaire de transactions JTA pour les EJB, les entités JPA, etc.


1

resource_local vs JTA il s'agit de transaction locale vs transaction globale. Il s'agit de gérer plusieurs ressources en une seule transaction.

CMT vs BMT, il s'agit de savoir qui ouvre et clôture la transaction - développeur d'applications ou serveur d'applications.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.