Attualmente sto recuperando sia un UserTransaction che un DataSource da un server Weblogic 10.3 che utilizza JNDI.Come ottenere le connessioni JDBC ottenute da un'origine dati JNDI per partecipare a UserTransaction utilizzando Weblogic 10.3?
Ho impostato il Datasource fino a 'supportare le transazioni globali' e di utilizzare 'Registrazione Ultima Resource'
mia speranza era che cominciando un UserTranscation e poi il recupero di una connessione JDBC dall'origine dati il collegamento avrebbe partecipato a la transazione.
Questo non sembra essere il caso, e le mie istruzioni di inserimento vengono commesse immediatamente e il rollback della transazione non ha alcun effetto.
Le mie precedenti ipotesi sono corrette?
Qualcuno può indicarmi la direzione di alcuni documenti o esempi su come ottenere ciò?
Molte grazie in anticipo
UPDATE:
Come richiesto ecco un contorno scheletro del codice che sto usando:
private void doSomething() {
Connection conn = null;
try {
Hashtable env = new java.util.Hashtable();
env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
env.put(javax.naming.Context.PROVIDER_URL,"t3://localhost:8080");
InitialContext ctx = InitialContext(env));
UserTransaction transaction = null;
transaction = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
DataSource dataSource = (DataSource) context.lookup("jdbc/xxxxx/DataSource");
conn = dataSource.getConnection();
transaction.begin();
// JDBC code goes here
transaction.commit();
} catch(Exception e) {
// TODO
if (transaction != null) {
try {
transaction.rollback();
} catch (Exception ex) {
// TODO
}
} finally {
if (con != null) {
conn.close
}
}
}
UPDATE 2:
Al fine di risolvere questo problema ho dovuto fare 2 cose:
Modificare l'ordine del codice per iniziare la transazione dell'utente e quindi ottenere una connessione dal Datastore (come indicato da Pascal Thivent).
Modificare l'origine dati referenziata da "" jdbc/xxxxx/DataSource "" a XADatasource. Questo perché chiamavo il codice all'interno della transazione utente che utilizzava un'altra origine dati che era già configurata per supportare LLR e, come sottolineato da Pascal Thivent di seguito, è possibile avere una sola origine dati LLR partecipare a una trascrizione.
Ho accettato la risposta di Pascal Thivent di seguito perché ha spiegato entrambi questi problemi.
Grazie per il vostro aiuto finora. Ho aggiunto il contorno dello scheletro del mio codice come richiesto. – lucasweb
Ho provato il tuo suggerimento. Il risultato è il seguente errore: La connessione è già stata creata in questo contesto di tx per il pool denominato ABI_DS. Tentativo illegale di creare una connessione da un altro pool: AMS_DS Dove ABI_DS è l'origine dati che sto utilizzando e AMS_DS è un'altra origine dati configurata per la stessa distribuzione – lucasweb