2009-12-18 22 views
5

Actualmente estoy recuperando un UserTransaction y un DataSource de un servidor Weblogic 10.3 usando JNDI.¿Cómo obtener conexiones JDBC obtenidas de un origen de datos JNDI para participar en una UserTransaction usando Weblogic 10.3?

yo he dado la fuente de datos hasta 'Apoyo a las transacciones globales' y utilizar 'Registro último recurso'

Mi esperanza era que al comenzar un UserTranscation y luego recuperar una conexión JDBC del origen de datos de la conexión participaría en la transacción.

Esto no parece ser el caso, y mis instrucciones de inserción se están confirmando de inmediato y la anulación de la transacción no tiene ningún efecto.

¿Son correctas mis suposiciones anteriores?

¿Alguien me puede indicar algún documento o muestras sobre cómo lograr esto?

Muchas gracias de antemano

ACTUALIZACIÓN:

a lo solicitado aquí es un esquema esqueleto del código que estoy utilizando:

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 
    } 
} 
} 

ACTUALIZACIÓN 2:

Con el fin de resolver este problema tuve que hacer 2 cosas:

  1. Cambie el orden del código para comenzar primero la transacción del usuario y luego obtener una conexión del almacén de datos (como lo señala Pascal Thivent).

  2. Cambie el origen de datos referenciado por '"jdbc/xxxxx/DataSource"' a un XADatasource. Esto se debe a que estaba llamando al código dentro de la transacción del usuario que utilizó otro Datasource que ya estaba configurado para admitir LLR y, tal como lo señala Pascal Thivent a continuación, solo puede tener un origen de datos LLR participar en una transcation.

He aceptado la respuesta de Pascal Thivent a continuación porque explicaba estos dos problemas.

Respuesta

2

Sí, sus suposiciones son correctas y, de acuerdo con Create LLR-enabled JDBC data sources, su fuente de datos parece configurada correctamente.

¿Se obtiene la conexión después de iniciar la transacción del usuario? ¿Puedes mostrar tu código o pseudo código?

ACTUALIZACIÓN: Como se mencionó en 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.

Por lo tanto, ¿podría intentar esto:

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

Update2: No estoy seguro de entender de donde está viniendo la segunda conexión (su pseudo código no muestra esto).Sin embargo, de acuerdo con el mismo 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.

En realidad, sin un ejemplo plenamente representativo, me siento un poco como caminar en la oscuridad :)

+0

Gracias por su ayuda hasta el momento. He agregado el esquema esquemático de mi código según lo solicitado. – lucasweb

+0

Intenté su sugerencia. Resultó en el siguiente error: La conexión ya se ha creado en este contexto tx para el grupo denominado ABI_DS. Intento ilegal de crear conexión desde otro grupo: AMS_DS Donde ABI_DS es el origen de datos que estoy usando y AMS_DS es otro origen de datos configurado para el mismo despliegue – lucasweb

Cuestiones relacionadas