Java + Tomcat, ¿está muriendo la conexión de la base de datos?

Tengo una configuración de instancia de tomcat pero la conexión de base de datos que he configurado en context.xml sigue muriendo después de períodos de inactividad.

Cuando reviso los registros obtengo el siguiente error:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: el último paquete recibido correctamente del servidor fue hace 68051 segundos. El último paquete enviado satisfactoriamente al servidor fue hace 68051 segundos, que es más largo que el valor configurado del servidor de ‘wait_timeout’. Debe considerar caducar y / o probar la validez de la conexión antes de usarla en su aplicación, boost los valores configurados del servidor para los tiempos de espera del cliente o usar la propiedad de conexión del Conector / J ‘autoReconnect = true’ para evitar este problema.

Aquí está la configuración en context.xml:

 

Estoy usando autoReconnect = ture como dice el error, pero la conexión sigue muriendo. Nunca antes había visto esto suceder.

También he verificado que todas las conexiones a la base de datos se cierran correctamente.

Documentación de Tomcat

DBCP usa el conjunto de conexiones de la base de datos Jakarta-Commons. Se basa en la cantidad de componentes de Jakarta-Commons:

 * Jakarta-Commons DBCP * Jakarta-Commons Collections * Jakarta-Commons Pool 

Este atributo puede ayudarte.

 removeAbandonedTimeout="60" 

Estoy usando el mismo pool de conexiones y estoy configurando estas propiedades para evitar lo mismo, simplemente no está configurado a través de tomcat. Pero si lo primero no funciona, intente esto.

 testWhileIdle=true timeBetweenEvictionRunsMillis=300000 

Solo para aclarar qué es lo que realmente está causando esto. MySQL por defecto finaliza las conexiones abiertas después de 8 horas de inactividad. Sin embargo, el grupo de conexiones de la base de datos retendrá conexiones durante más tiempo.

Por lo tanto, al establecer timeBetweenEvictionRunsMillis = 300000 está instruyendo al grupo de conexiones que se ejecute a través de las conexiones y desaloje y cierre los inactivos cada 5 minutos.

La opción removeAbandoned está en desuso a partir de DBCP 1.2 (aunque todavía está presente en la twig 1.3). Aquí hay una explicación no oficial.

No sé si la respuesta anterior hace básicamente lo mismo, pero algunos de nuestros sistemas usan la conexión de DB una vez a la semana y he visto que proporcionamos un indicador de -Otimeout o algo por el estilo a mysql para establecer la conexión. se acabó el tiempo.