oracle jboss connection-pooling reconnect

¿Hay alguna forma de que el conjunto de conexiones de JBoss se vuelva a conectar a Oracle cuando las conexiones se dañen?



connection-pooling reconnect (6)

Aunque puede usar el viejo truco de "seleccionar 1 de doble", la desventaja de esto es que emite una consulta extra cada vez que toma prestada una conexión del grupo. Para grandes volúmenes, esto es un desperdicio.

JBoss proporciona un validador de conexión especial que se debe utilizar para Oracle:

<valid-connection-checker-class-name> org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker </valid-connection-checker-class-name>

Esto hace uso del método patentado ping () en la clase de conexión Oracle JDBC y utiliza el código de red subyacente del controlador para determinar si la conexión aún está activa.

Sin embargo, sigue siendo un desperdicio ejecutar esto cada vez que se toma prestada una conexión, por lo que es posible que desee utilizar la instalación donde un hilo de fondo comprueba las conexiones en el grupo, y descarta silenciosamente las muertas. Esto es mucho más eficiente, pero significa que si las conexiones se agotan, cualquier intento de usarlas antes de que el hilo de fondo ejecute su verificación fallará.

Consulte los documentos de wiki sobre cómo configurar la verificación de antecedentes (busque background-validation-millis ).

Tenemos nuestro JBoss y Oracle en servidores separados. Las conexiones parecen haberse descartado y están causando problemas con JBoss. ¿Cómo puedo hacer que JBoss se vuelva a conectar a Oracle si la conexión es mala mientras averiguamos por qué se están eliminando las conexiones desde el principio?


JBoss proporciona 2 formas de validar la conexión: - Basado en ping Y - Basado en consultas

Puede usar según los requisitos. Esto se programa por hilo separado según la duración definida en el archivo de configuración del origen de datos.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

En algún momento, si no está utilizando el controlador Oracle correcto en Jboss, es posible que obtenga Classcast o un error relacionado y, para esa conexión, puede comenzar la deserción del grupo de conexiones. Puede intentar crear su propia clase ConnectionValidator implementando la interfaz org.jboss.resource.adapter.jdbc.ValidConnectionChecker . Esta interfaz proporciona solo el único método '' isValidConnection() '' y espera ''NULL'' a cambio de una conexión válida.

Ex:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable { private Method ping; // The timeout (apparently the timeout is ignored?) private static Object[] params = new Object[] { new Integer(5000) }; public SQLException isValidConnection(Connection c) { try { Integer status = (Integer) ping.invoke(c, params); if (status.intValue() < 0) { return new SQLException("pingDatabase failed status=" + status); } } catch (Exception e) { log.warn("Unexpected error in pingDatabase", e); } // OK return null; } }


No es suficiente representante para un comentario, por lo que se trata de una respuesta. El método ''Select 1 from dual'' y skaffman''s org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker son equivalentes, aunque la comprobación de conexión proporciona un nivel de abstracción. Tuvimos que descompilar los controladores Oracle jdbc para un ejercicio de resolución de problemas y la implementación interna de Oracle del ping es realizar un ''Select ''x'' from dual'' . Natch.


Por lo general, hay una opción de configuración en el grupo para permitir que una consulta de validación se ejecute en préstamo. Si la consulta de validación se ejecuta correctamente, el grupo devolverá esa conexión. Si la consulta no se ejecuta correctamente, el grupo creará una nueva conexión.

JBoss Wiki documenta los diversos atributos del grupo.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

Parece que debería hacer el truco.


Recientemente hemos tenido algunas fallas en el manejo de solicitudes flotantes causadas por los bloqueos de sesión DBMS_LOCK huérfano que se conservan indefinidamente en el grupo de conexiones del lado del cliente.

Así que aquí hay una solución que fuerza la caducidad de la sesión en 30 minutos pero no afecta la operación de la aplicación:

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end from V$SESSION where AUDSID = userenv(''SESSIONID'')</check-valid-connection-sql>

Esto puede implicar cierta ralentización en el proceso de obtención de conexiones del conjunto. Asegúrate de probar esto bajo carga.


Una pequeña actualización de la respuesta de @ skaffman. En JBoss 7, debe usar el atributo "class-name" al establecer un verificador de conexión válido y también el paquete es diferente:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />