Tenemos nuestros 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?¿Hay alguna forma de que el conjunto de conexiones de JBoss se vuelva a conectar a Oracle cuando las conexiones se vuelvan malas?
Respuesta
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.
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
).
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
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
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;
}
}
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.
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" />
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.
Muy buen truco. –
Amigo esto es tan resbaladizo. –
¿Qué significa eso 30/60/24? –
- 1. Conexiones WCF que exceden las conexiones máximas cuando se utiliza el patrón asíncrono
- 2. Faltan conexiones en el conjunto de conexiones tomcat jdbc
- 3. ¿Cómo volver a conectar automáticamente el grupo de conexiones de Oracle después de la interrupción de la conexión?
- 4. Tamaño máximo de conjunto de conexiones
- 5. ¿Las conexiones TCP se mueven a otro puerto después de que se abren?
- 6. PostgreSQL: deshabilitar temporalmente las conexiones
- 7. Forma ideal de configurar una conexión JMS para que se vuelva a conectar automáticamente
- 8. ¿Qué sucede cuando las conexiones a MongoDB no están cerradas?
- 9. ¿Qué sucede cuando se agota un grupo de conexiones?
- 10. JBoss AS 7 no acepta conexiones remotas
- 11. Cómo matar las conexiones de MySQL
- 12. ¿Hay alguna manera de evitar que el texto se vuelva gris cuando desactivo un botón?
- 13. ¿Hay alguna forma de que no se elimine el popover cuando se presiona fuera de él?
- 14. Conectar de forma remota a WebDev.WebServer.exe
- 15. Administración de las conexiones de SQL Server
- 16. se cierren las conexiones de base de datos en Java
- 17. Vuelva a conectar el proyecto Eclipse a SVN con Subclipse
- 18. ¿Hay alguna forma de evitar que las sombras de CALayer se superpongan a capas adyacentes?
- 19. Número óptimo de conexiones en el grupo de conexiones
- 20. Advertencia de conexión de ActiveRecord. (Las conexiones a la base de datos no se cerrarán automáticamente)
- 21. Cómo encontrar lo que está usando las conexiones en mi grupo de conexiones
- 22. Conexiones persistentes a memcached en PHP
- 23. Crear un socket restringido a las conexiones de localhost solo
- 24. ¿Hay alguna manera de hacer que SSMS abra ciertas conexiones cada vez que lo abro?
- 25. Error al recuperar conexiones en jboss a múltiples bases de datos aunque no haya transacción
- 26. No se puede conectar mi aplicación de rieles a Oracle
- 27. El grupo de conexiones JDBC no vuelve a abrir Conexiones en tomcat
- 28. ¿Cuántas conexiones máximas puede tener Oracle?
- 29. ¿El límite de HttpWebRequest de 2 conexiones por host se aplica a HttpClient?
- 30. ¿Cómo enumerar las conexiones activas/abiertas en Oracle?
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