Come si determina se una connessione JDBC è stata recuperata da un'origine dati abilitata JTA o JDBC diretta?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

Domanda

Sto usando un'API del fornitore per ottenere una connessione JDBC al database dell'applicazione. L'API funziona quando è in esecuzione nel server delle applicazioni o in modalità autonoma. Voglio eseguire una serie di istruzioni SQL in un'unica transazione. Sto bene se si verificano nel contesto della transazione JTA, se esiste. Tuttavia, in caso contrario, è necessario utilizzare i metodi di demarcazione delle transazioni JDBC. (La chiamata di questi metodi su una connessione JDBC che partecipa a una transazione JTA provoca un'eccezione SQLE.)

Quindi devo essere in grado di determinare se la connessione proviene dall'origine dati abilitata JTA o se è solo una connessione JDBC diretta.

Esiste un modo semplice per prendere questa decisione?

Grazie!

È stato utile?

Soluzione

Anche se è semplice JDBC, puoi avere una transazione JTA abilitata. Il controllo del flag autoCommit NON sarà di aiuto in questo senso. Puoi essere in una transazione, distribuita o meno, con autoCommit impostato su false. autoCommit impostato su true ti direbbe che non sei in una transazione distribuita ma un valore di false significa solo che non eseguirai il commit automatico ... potrebbe essere in qualsiasi tipo di transazione.

Penso che dovrai chiamare UserTransaction.getStatus () e verificare che non sia uguale a Status.NoTransaction (). Questo ti direbbe se sei in una transazione JTA.

Altri suggerimenti

Ciò che dice Thilo ha senso.

Altrimenti, non sono sicuro di un modo diretto, MA ti darò un "hack" modo

scrivi un BAD SQL che sai darà un'eccezione DB. Ciò comporterà una traccia dello stack. Dalla traccia dello stack, puoi scoprire se si tratta di una connessione derivata JTA o NOT?

Puoi provare a controllare il flag autoCommit di Connection per vedere se è in una transazione (indipendentemente da dove provenga). (Apparentemente, vedi la risposta accettata, questo non funziona troppo bene. Non sto cancellando questa risposta perché è ancora valido quanto segue:)

Ma penso che dovresti davvero modificare la tua API per dipendere esclusivamente da transazioni esterne. Se desideri ancora supportare il semplice JDBC, includilo in un'API separata che avvia la transazione.

Aggiornamento: rileggi la tua domanda e scopri che non stai fornendo un'API, ma desideri utilizzare una connessione gestita dal contenitore. Tuttavia, puoi semplicemente imporre (come parte dei requisiti della tua domanda) che JTA sia in vigore? In caso contrario, è possibile fornire un'opzione di configurazione per tornare alle transazioni gestite manualmente. Per una caratteristica così critica sembra ragionevole richiedere la corretta configurazione (al contrario di provare a indovinare cosa sarebbe appropriato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top