2008-09-24 32 views

Respuesta

25

Por lo general, hay una opción de configuración en el grupo para permitir que se ejecute una consulta de validación 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.

El JBoss Wiki documenta los diversos atributos del conjunto.

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

Parece que debe hacer el truco.

+0

Si ya tiene esa línea en su cfg, también verifique que no tiene los valores "validate-on-match" y "background-validation" en false (consulte la página wiki enlazada para obtener más información). – Pino

30

Si bien 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 de la agrupación. 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 que el uso del método de ping propietaria() en la clase de conexión JDBC de Oracle, y utiliza código de red subyacente del conductor para determinar si la conexión todavía está viva.

Sin embargo, sigue siendo un desperdicio ejecutar esto cada vez que se toma prestada una conexión, por lo que puede 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 do mueren, cualquier intento de usarlas antes de que el hilo de fondo se ejecute será fallado.

Consulte el wiki docs para saber cómo configurar la verificación de antecedentes (busque background-validation-millis).

+7

El método 'Seleccionar 1 de dual' y org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker es equivalente, aunque la comprobación de conexión proporciona un nivel de abstracción. Tuvimos que descompilar los controladores jdbc de Oracle para un ejercicio de resolución de problemas y la implementación interna de Oracle del ping utilizado en la verificación de conexión, es realizar un 'Seleccionar' x 'desde dual'. Natch. – abh

+0

Tenga en cuenta que 'OracleValidConnectionChecker' tenía un [error menor] (https://bugzilla.redhat.com/show_bug.cgi?id=699816) en JBoss AS 4 y 5. También recuerdo que tenía problemas de rendimiento bajo una gran carga concurrente debido al uso de hilo de pinger separado debajo del capó. – Vadzim

5

JBoss ofrece 2 formas para validar la conexión: - Ping basada y - consulta basada

Se puede utilizar según el requisito. 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> 

algún tiempo si usted no está teniendo controlador de Oracle a la derecha en Jboss, puede obtener classcast o error relacionado y para esa conexión puede comenzar deserción de agrupación 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; 
    } 
} 
9

insuficiente representante de un comentario, así que está en una forma de una respuesta. El 'Select 1 from dual' y el método org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker de skaffman 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 solución de problemas y la implementación interna de Oracle del ping es para realizar un 'Select 'x' from dual'. Natch.

2

Una pequeña actualización de la respuesta de @ skaffman. En JBoss 7 usted tiene que utilizar "nombre-clase" atributo al establecer corrector conexión válida y también el paquete es diferente:

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

3

Hemos recientemente tuvo algunos fallos Tratamiento de la petición flotante causada por huérfanos oráculo DBMS_LOCK cerraduras de sesión que se retuvo indefinidamente en el grupo de conexiones del lado del cliente.

Así que aquí es una solución que obliga sesión de caducidad en 30 minutos, pero no afecta al 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 cierta desaceleración en el proceso de obtención de conexiones desde la piscina. Asegúrate de probar esto bajo carga.

+0

Muy buen truco. –

+0

Amigo esto es tan resbaladizo. –

+0

¿Qué significa eso 30/60/24? –

Cuestiones relacionadas