¿Hay alguna forma de que el grupo de conexiones de JBoss se vuelva a conectar a Oracle cuando las conexiones fallan?

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

Pregunta

Tenemos nuestro JBoss y Oracle en servidores separados.Las conexiones parecen haberse interrumpido 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 interrumpen las conexiones en primer lugar?

¿Fue útil?

Solución

Generalmente 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 con éxito, el grupo devolverá esa conexión. Si la consulta no se ejecuta correctamente, el grupo creará una nueva conexión.

El JBoss Wiki documenta los diversos atributos del grupo.

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

Parece que debería funcionar.

Otros consejos

Si bien puede usar el viejo " seleccione 1 de dual " truco, el inconveniente de esto es que emite una consulta adicional 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 debe usarse para Oracle:

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

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

Sin embargo, todavía es 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 subproceso de fondo verifica las conexiones en el grupo y descarta silenciosamente las conexiones muertas. Esto es mucho más eficiente, pero significa que si las conexiones se cortan, cualquier intento de usarlas antes de que se ejecute el subproceso en segundo plano fallará.

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

No hay suficiente representante para un comentario, por lo que tiene forma de respuesta.El 'Select 1 from dual' y skaffman org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker El método es equivalente, aunque la verificación de conexión proporciona un nivel de abstracción.Tuvimos que descompilar los controladores jdbc de Oracle para un ejercicio de solución de problemas y la implementación interna del ping por parte de Oracle consiste en realizar un 'Select 'x' from dual'.Natch.

JBoss proporciona 2 formas de validar la conexión: - Ping basado en AND - Basado en consultas

Puede usar según el requisito. Esto está programado 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 tiene el controlador oracle correcto en Jboss, puede recibir un error de difusión o relacionado y, para esa conexión, puede comenzar a abandonar el grupo de conexiones. Puede intentar crear su propia clase ConnectionValidator implementando la interfaz org.jboss.resource.adapter.jdbc.ValidConnectionChecker. Esta interfaz proporciona un solo método 'isValidConnection()' y espera 'NULL' a cambio de una conexión válida.

Ej:

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

Recientemente hemos tenido algunas fallas en el manejo de solicitudes flotantes causadas por bloqueos de sesión de oráculo DBMS_LOCK huérfanos que se retuvieron indefinidamente en el grupo de conexiones del lado del cliente.

Entonces, aquí hay una solución que fuerza la expiración de la sesión en 30 minutos pero no afecta el funcionamiento 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 una ralentización en el proceso de obtención de conexiones del grupo. Asegúrese de probar esto bajo carga.

Una pequeña actualización de la respuesta de @ skaffman. En JBoss 7 debe usar & Quot; class-name & Quot; atributo al configurar un comprobador 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" />

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