2010-07-10 9 views
49

I termini "jta-datasource" e "resource-local datasource" sono un po 'vaghi per me. Sto mettendo giù quello che sto capendo (o presumo) e vorrei che tu dicessi dove ho ragione/torto.Differenza tra un'origine dati "jta-datasource" e "risorsa-locale"?

  • Lo stesso database può essere indicato come un JTA-datasource o come origine dati locale risorsa
  • Se menzionato come JTA-origine dati, quindi i fagioli/altre classi possono utilizzare JTA. Quindi, UserTransaction interfaccia
  • Non è possibile utilizzare CMT/BMT se l'origine dati è risorsa locale
  • Se menzionato come risorsa origine dati locali, le transazioni non sono a conoscenza JTA. Il codice può utilizzare l'interfaccia EntityTransaction ma non l'interfaccia UserTransaction

Grazie!

risposta

62

I termini "jta-datasource" e "resouce-local datasource" sono un po 'vaghi per me.

Immagino che in realtà si riferiscano agli elementi jta-datasource e non-jta-datasource. In breve:

  • se il tipo di transazione dell'unità persistenza è JTA, l'elemento jta-datasource viene utilizzata per dichiarare il nome JNDI dell'origine dati JTA che verrà utilizzata per ottenere connessioni. Questo è il caso comune.
  • Se il tipo di transazione dell'unità di persistenza è risorsa locale, è necessario utilizzare non-jta-data-source per dichiarare il nome JNDI di un'origine dati non JTA.
  • Lo stesso database può essere indicato come un JTA-datasource o come una risorsa origine dati locale

Questo è corretto. E non ho menzionato questo appena sopra, ma alcuni provider consentono anche di dichiarare sia uno jta-datasourcee uno non-jta-datasource e utilizzare il successivo per la lettura ottimizzata attraverso connessioni non JTA (cioè che non sarà associato a una transazione JTA in corso) .

  • Se menzionato come JTA-origine dati, quindi i fagioli/altre classi possono utilizzare JTA. Quindi, interfaccia UserTransaction.

La prima parte è corretta, l'ultima parte non del tutto. Dalla specifica EJB 3.0, sezione 13.3.4 Fagioli Enterprise con Container-Managed Transaction demarcazione:

metodi commerciali del bean [...] non devono tentare di ottenere o di utilizzare l'interfaccia javax.transaction.UserTransaction.

e la sezione 16.12 UserTransaction Interfaccia:

Il contenitore non deve rendere l'interfaccia UserTransaction a disposizione dei bean enterprise che non sono autorizzati a utilizzare questa interfaccia.

In altre parole, l'interfaccia UserTransaction non è disponibile per i bean enterprise CMT.

  • Non è possibile utilizzare CMT/BMT se l'origine dati è risorsa locale

La formulazione è un po 'di confusione qui, ma direi che questo non strettamente corretto. Dalla specifica JPA 1.0, sezione § 5.5 Controllo Operazioni:

Un gestore entità applicazione gestiti può essere sia un gestore di entità JTA o un gestore di entità delle risorse locali.

...

Sia JTA gestori di entità e gestori di entità di risorse locali sono tenuti ad essere supportato in Java EE contenitori web e container EJB. All'interno di un ambiente EJB, viene in genere utilizzato un gestore entità JTA.

E sezione 6.2.1.2 delle transazioni di tipo

L'attributo transaction-type viene utilizzato per specificare se i gestori di entità forniti dalla fabbrica soggetto responsabile per l'unità di persistenza devono essere JTA gestori di entità o risorsa -gestori di entità locali. Il valore di questo elemento è JTA o RESOURCE_LOCAL. Un tipo di transazione di JTA presuppone che venga fornita un'origine dati JTA, specificata dall'elemento jta-data-source o fornita dal contenitore. In generale, negli ambienti Java EE, un transaction-type di RESOURCE_LOCAL presuppone che venga fornita un'origine dati non JTA. In un ambiente Java EE, se questo elemento non è specificato, il valore predefinito è JTA.

modo da poter utilizzare un'applicazione gestito entità responsabile che può essere un gestore di entità risorse locali (è necessario iniettare un EntityManagerFactory per ottenere il EM da esso in questo caso) e non sarà parte di una transazione JTA. Vedi this (very interesting) discussion.

  • Se menzionato come risorsa origine dati locali, le transazioni non JTA sono a conoscenza. Il codice può usare l'interfaccia EntityTransaction ma non l'interfaccia UserTransaction

Anche in questo caso, il testo è un po 'di confusione, ma direi che questo è corretto.

+0

Ciao, Grazie mille per aver dedicato del tempo e aver spiegato tutto così chiaramente !!! Vedo ora che usiamo il termine "risorsa locale EntityManager" e non "risorsa origine dati locale". Sì, intendevo l'origine non-jta-data quando dicevo "fonte dati locale risorsa". Ecco come ho capito ora: JTA/RESOURCE_LOCAL -> Tipo di transazione di EntityManager. Determina chi controlla la transazione sottostante. JTA/EntityTransaction API JTA EntityManger: Container gestisce questo EntityManager. Coinvolge nelle transazioni JTA. Una transazione JTA può essere una CMT o una BMT. Può essere utilizzato in classi gestite. – stratwine

+0

Resource-Local EntityManager: EnityManager non è gestito dal contenitore. Coinvolge in transazioni non JTA. Si utilizza l'API EntityTransaction. può utilizzare in POJO Per BMT, UserTransaction utilizza sempre un JTA-datasource e non può usare un non-JTA-datasource Allo stesso modo per CMT troppo, il contenitore potrebbe usare solo un JTA-datasource – stratwine

+1

@stratwine: Sei il benvenuto , felice che tu l'abbia trovato utile (e la tua comprensione sembra corretta). Per quanto riguarda la formulazione, non volevo essere pignolo, ma poiché la specifica definisce una terminologia molto precisa (e sottile), usarla rende la comunicazione più facile, motivo per cui ho insistito un po 'su questo (e mi raccomando di leggere le sezioni ho citato parzialmente). –