¿Cómo se determina si una conexión JDBC se recuperó de un DataSource habilitado para JTA o JDBC directo?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy usando una API de proveedor para obtener una conexión JDBC a la base de datos de la aplicación. La API funciona cuando se ejecuta en el servidor de aplicaciones o cuando se ejecuta en modo independiente. Quiero ejecutar una serie de declaraciones SQL en una sola transacción. Estoy de acuerdo con que ocurran en el contexto de la transacción JTA si existe. Sin embargo, si no es así, necesito usar los métodos de demarcación de transacciones JDBC. (Llamar a estos métodos en una conexión JDBC que participa en una transacción JTA provoca una excepción SQLEx.)

Por lo tanto, necesito poder determinar si la conexión proviene de DataSource habilitado para JTA o si es solo una conexión JDBC directa.

¿Hay una manera directa de hacer esta determinación?

¡Gracias!

¿Fue útil?

Solución

Incluso si es JDBC directo, puede habilitar una transacción JTA. La verificación de la marca de autoCommit NO ayudará en este sentido. Puede estar en una transacción, distribuida o de otro modo, con autoCommit configurado en falso. autoCommit establecido en true le indicaría que no está en una transacción distribuida, pero un valor de false solo significa que no se confirmará automáticamente ... podría estar en cualquier tipo de transacción.

Creo que deberás llamar a UserTransaction.getStatus () y verificar que no sea igual a Status.NoTransaction (). Esto te diría si estás en una transacción JTA.

Otros consejos

Lo que dice thilo tiene sentido.

De lo contrario, no estoy seguro de una manera directa PERO te daré un "hack" camino

escriba un BAD SQL que sabrá que dará una excepción de base de datos. Eso dará lugar a un seguimiento de pila. A partir del seguimiento de la pila, puede averiguar si es una conexión derivada de JTA o NO?

Puede intentar verificar el indicador de AutoCommit de la conexión para ver si se trata de una transacción (independientemente de su origen). (Aparentemente, vea la respuesta aceptada, esto no funciona demasiado bien. No estoy eliminando esta respuesta porque lo siguiente sigue en pie):

Pero creo que realmente debería modificar su API para depender exclusivamente de transacciones externas. Si aún desea admitir JDBC sin formato, envuélvalo en una API independiente que simplemente inicie la transacción.

Actualización: solo vuelva a leer su pregunta y vio que no está proporcionando una API, pero desea utilizar una conexión administrada por contenedor. Pero aún así, ¿puede simplemente exigir (como parte de los requisitos de su solicitud) que JTA esté vigente? De lo contrario, podría proporcionar una opción de configuración para recurrir a transacciones gestionadas manualmente. Para una característica tan crítica, parece razonable requerir la configuración adecuada (en lugar de tratar de adivinar qué sería apropiado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top