2012-09-05 24 views
12

Estamos en el proceso de actualizar de JBoss 6 a JBoss 7. La naturaleza de nuestra aplicación tiene una instancia de base de datos separada por cliente, así como una configuración central base de datos común para todos los clientes. A menudo tenemos código EJB que al menos hará referencia a la base de datos central más los datos del cliente individual en una sola llamada, e incluso algunos procesos generales de fondo que pasan por todos los clientes.Error al recuperar conexiones en jboss a múltiples bases de datos aunque no haya transacción

En JBoss 6 esto se manejó sin problema estableciendo el método con un atributo de transacción NOT_SUPPORTED. Sin embargo, JBoss 7 se queja de esto con el siguiente error:

ARJUNA012140: Adding multiple last resources is disallowed. Trying to add LastResourceRecord(XAOnePhaseResource([email protected][connectionListener=d3ce980 connectionManager=25b47a05 warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:14, subordinatenodename=null, eis_name=unknown eis name >])), but already have LastResourceRecord(XAOnePhaseResource([email protected][connectionListener=1a05d94a connectionManager=135f1cfe warned=false currentXid=< formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:11, node_name=1, branch_uid=0:ffff0a2c28d1:-5a4c1f9a:504689c9:13, subordinatenodename=null, eis_name=unknown eis name >]))

¿Cómo podemos solucionar este problema sin envolver todas las llamadas a las diferentes bases de datos en una llamada EJB independiente y transacción. ¿Hay alguna forma de desactivar realmente la gestión de transacciones de JBoss en una llamada a EJB o algo similar?

Nota: Esta pregunta se modificó después de que se inició la recompensa en función de un descubrimiento adicional para agudizar el enfoque en el problema específico y eliminar otras posibilidades que se excluyeron.

+1

Encontré esto. https://venugopaal.wordpress.com/2009/02/11/jboss5-adding-multiple-last-resources-is-disallowed/. ¿Relacionado? – pd40

Respuesta

7

OK, resulta que a diferencia de JBoss6, una transacción NOT_SUPPORTED sigue siendo una transacción en lo que se refiere a la lógica de validación para recuperar orígenes de datos.

La forma de evitar esto es hacer que todo el EJB un grano de transacciones administrado:

@TransactionManagement(TransactionManagementType.BEAN) 

Esto limita lamentablemente cierta flexibilidad en la que algunas veces se prefiere controlar este método por método, pero no es una solución demasiado dolorosa.

13

dos sugerencias:

  1. considerar la actualización de las fuentes de datos a sus equivalentes Xa. Esto resolverá todos tus problemas. Sospecho que estás impedido aquí?
  2. Considere la posibilidad de establecer com.arjuna.ats.arjuna.allowMultipleLastResources en true en el servidor conf. Esto permitirá el comportamiento que desee, pero desafortunadamente para toda la aplicación, no solo el método.

Actualización:

No recomiendo que permite múltiples recursos de una fase ya que debilita las propiedades transaccionales de aplicación que sustancialmente. Pero si usted quiere hacer esto en JBoss 7 tiene que modificar y añadir standalone.xml:

<system-properties> 
     <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/> 
</system-properties> 

Ahora tiene un sistema que no está muy lejos de uno sin transacciones. Lo que todavía hará, sin embargo, es advertirte si obtienes resultados heurísticos.

Mi recomendación es seguir utilizando fuentes de datos XA si puede.

Actualización 2:

Ah, y si alguien viene a leer esto, quiero añadir que si se puede dividir el código en diferentes métodos, a diferencia de la OP, yo recomendaría la reestructuración de su código y su uso @TransactionAttribute(REQUIRES_NEW) para crear transacciones paralelas.Esto es mejor que encender múltiples 1PC, aunque no tan bueno como encender XA.

+0

Gracias. Nos plaided con XA, pero no funcionó (probablemente fue una falla de nuestra parte), pero de todos modos fue la solución incorrecta, por lo que no presionamos en esa dirección. ¿Dónde está allowMultipleLastResources en JBoss 7, no pudimos encontrarlo? – Yishai

+0

Ver la actualización de mi respuesta –

+0

¿Te funcionó? –

Cuestiones relacionadas