Unità di persistenza come RESOURCE_LOCAL o JTA?


87

Ho domande come di seguito:

  1. Qual è la differenza tra questi due?
  2. Entrambi sono supportati da tutti i database?
  3. JPA TransactionManager e JTA TransactionManager sono diversi?

Risposte:


101

Le implementazioni JPA possono scegliere di gestire le transazioni stesse ( RESOURCE_LOCAL) o di farle gestire dall'implementazione JTA del server delle applicazioni.

Nella maggior parte dei casi, RESOURCE_LOCAL va bene. Ciò utilizzerebbe transazioni di livello JDBC di base. Lo svantaggio è che la transazione è locale nell'unità di persistenza JPA, quindi se si desidera una transazione che si estende su più unità di persistenza (o altri database), RESOURCE_LOCAL potrebbe non essere sufficiente.

JTA viene utilizzato anche per la gestione delle transazioni su sistemi come JMS e JCA, ma per la maggior parte di noi è un utilizzo abbastanza esotico.

Per utilizzare JTA, è necessario il supporto nel server delle applicazioni e anche il supporto dal driver JDBC.


3
sembra che glassfih non mi permetta di usare resource_local - come posso farlo?
Pete_ch

3
Come nota a margine : si può ancora ottenere la funzionalità JTA, anche senza un server di applicazioni Java EE completo utilizzando soluzioni di terze parti, come ad esempio Atomikos . Quindi puoi avere un contenitore web leggero come Tomcat e ottenere comunque il supporto JTA.
informatik01

84

In aggiunta ad altre risposte

Ecco un estratto dall'articolo estremamente utile (pubblicato sul sito web di Apache TomEE ), che può anche aiutare a rispondere alla prima domanda dell'OP (il link all'articolo è sotto).


Confronto dei contesti di persistenza RESOURCE_LOCAL e JTA


Con <persistence-unit transaction-type = "RESOURCE_LOCAL"> TU sei responsabile della creazione e del monitoraggio di EntityManager (PersistenceContext / Cache) ...

  • È necessario utilizzare EntityManagerFactory per ottenere un EntityManager
  • L' istanza EntityManager risultante è PersistenceContext / Cache
  • Un EntityManagerFactory può essere iniettato solo tramite l' annotazione @PersistenceUnit (non @PersistenceContext)
  • Siete non autorizzati a utilizzare @PersistenceContext per riferirsi ad un'unità di tipo RESOURCE_LOCAL
  • È necessario utilizzare l' API EntityTransaction per iniziare / eseguire il commit su ogni chiamata al proprio EntityManger
  • Chiamando entityManagerFactory.createEntityManager () due volte si ottengono due istanze EntityManager separate e quindi due PersistenceContexts / Caches separati.
  • Non è quasi mai una buona idea avere più di un'istanza di un EntityManager in uso (non crearne una seconda a meno che tu non abbia distrutto la prima)


Con <persistence-unit transaction-type = "JTA"> il CONTAINER eseguirà la creazione e il monitoraggio di EntityManager (PersistenceContext / Cache) ...

  • Non è possibile utilizzare EntityManagerFactory per ottenere un EntityManager
  • È possibile ottenere solo un EntityManager fornito dal contenitore
  • Un EntityManager può essere iniettato solo tramite l' annotazione @PersistenceContext (non @PersistenceUnit)
  • Siete non autorizzati a utilizzare @PersistenceUnit per riferirsi ad un'unità di tipo JTA
  • L' EntityManager fornito dal contenitore è un riferimento a PersistenceContext / Cache associato a una transazione JTA.
  • Se non è in corso alcuna transazione JTA, EntityManager non può essere utilizzato perché non è presente PersistenceContext / Cache.
  • Chiunque abbia un riferimento EntityManager alla stessa unità nella stessa transazione avrà automaticamente un riferimento alla stessa PersistenceContext / Cache
  • PersistenceContext / Cache viene scaricato e cancellato al momento del commit JTA

Chiunque sia interessato ad apprendere l'API Java Persistence, per favore fatevi un favore e leggete l'articolo completo qui: Concetti JPA: JPA 101 .


8
Volevo solo aggiungere un punto: se stai usando Spring puoi usare @ PersistenceContext e EntityManager con Resource_Local. In questo caso il contenitore Spring può gestire la transazione utilizzando l'annotazione @ Transactional.
Sam

Nel mio progetto transaction-type=RESOURCE_LOCALe @PersistenceContexte @Transactionalgestito da primavera
Ravi Parekh

Sto colpendo il triangolo rivolto verso l'alto a causa del collegamento che hai fornito.
Koray Tugay

@KorayTugay Mi dispiace, non ho capito bene cosa dici, quale triangolo?
informatik01

1
@LinuRadu Questa risposta potrebbe esserti utile: A cosa serve session.flush () in Hibernate
informatik01

18

Resource_Local e JTA sono gestori delle transazioni (metodi di esecuzione delle transazioni). Questa non è la proprietà del database ma il componente responsabile del coordinamento delle transazioni. I gestori delle transazioni JPA e JTA sono diversi. Il gestore delle transazioni JPA è responsabile delle transazioni JPA e si desidera utilizzarne uno se si esegue solo una transazione JPA. Il gestore delle transazioni JTA è un gestore delle transazioni generico e può inserire altre risorse come le code JMS nella transazione. In genere i contenitori Java EE utilizzano un gestore delle transazioni JTA per EJB, entità JPA, ecc.


1

resource_local vs JTA si tratta di transazione locale vs transazione globale. Si tratta di poter gestire più risorse in un'unica transazione.

CMT vs BMT riguarda chi sta aprendo e chiudendo la transazione: sviluppatore di applicazioni o server di applicazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.