2009-12-18 10 views
5

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:

  1. Modificare l'ordine del codice per iniziare la transazione dell'utente e quindi ottenere una connessione dal Datastore (come indicato da Pascal Thivent).

  2. 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.

risposta

2

Sì, le ipotesi sono corrette e, in base allo Create LLR-enabled JDBC data sources, l'origine dati sembra configurata correttamente.

Si ottiene la connessione dopo l'avvio della transazione utente? Puoi mostrare il tuo codice o lo pseudo codice?

UPDATE: Come accennato in Programming Considerations and Limitations for LLR Data Sources:

  • When programming with an LLR data source, you must start the global transaction before calling getConnection on the LLR data source. If you call getConnection before starting the global transaction, all operations on the connection will be made outside of the global transaction.

Quindi, si potrebbe provare questo:

transaction.begin(); //start the global tx before calling getConnection() 
conn = dataSource.getConnection(); 
... 
transaction.commit(); 

UPDATE2: Non sono sicuro di capire da dove il secondo collegamento sta arrivando (il tuo pseudo codice non lo mostra).Tuttavia, secondo lo stesso Programming Considerations and Limitations for LLR Data Sources:

  • Only instances of a single LLR data source may participate in a particular transaction. A single LLR data source may have instances on multiple WebLogic servers, and two data sources are considered to be the same if they have the same configured name. If more than one LLR data source instance is detected and they are not instances of the same data source, the transaction manager will roll back the transaction.

In realtà, senza un esempio pienamente rappresentativo, mi sento un po 'come camminare nel buio :)

+0

Grazie per il vostro aiuto finora. Ho aggiunto il contorno dello scheletro del mio codice come richiesto. – lucasweb

+0

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