Pregunta

Tengo una instancia de tomcat de instalación, pero la conexión de base de datos que tengo configurado en context.xml mantiene de morir después de períodos de inactividad.

Cuando reviso los logs me sale el siguiente error:

com.mysql.jdbc.excepciones.jdbc4.CommunicationsException:El último paquete recibido correctamente desde el servidor was68051 segundos hace.El último paquete enviado con éxito al servidor fue 68051 segundos atrás, que es más largo que el servidor configurado valor de 'wait_timeout'.Usted debería considerar o a punto de vencerse y/o pruebas conexión de validez antes de su uso en su aplicación, el aumento de la servidor configurado los valores de los tiempos de espera del cliente, o mediante el Connector/J conexión de la propiedad 'autoReconnect=true' para evitar este problema.

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

<Resource name="dataSourceName" 
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="username" 
        password="********"
        removeAbandoned = "true"
        logAbandoned = "true"
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

Estoy usando autoReconnect=true como el error dice que hacer, pero la conexión se mantiene de morir.Nunca he visto que esto suceda antes.

También he comprobado que todas las conexiones de base de datos se cierra correctamente.

¿Fue útil?

Solución

Documentación De Tomcat

El DBCP utiliza el Jakarta Commons Conexión de Base de datos a la Piscina.Se basa en el número de Jakarta Commons componentes:

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

Este atributo puede ayudar.

removeAbandonedTimeout="60"

Estoy usando la misma conexión de la agrupación de cosas y me voy a la configuración de estas propiedades para evitar la misma cosa solo que no configurado a través de tomcat.Pero si el primero no funciona, pruebe estos.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

Otros consejos

Sólo para aclarar lo que realmente está causando esto.MySQL por defecto termina conexiones abiertas después de 8 horas de inactividad.Sin embargo, la conexión de base de datos piscina conservará conexiones por más tiempo que eso.

Por lo tanto al establecer timeBetweenEvictionRunsMillis=300000 se instruye a la conexión de la piscina para que se ejecute a través de las conexiones y desalojar y cerrar holgazanes cada 5 minutos.

El removeAbandoned opción está obsoleta como de DBCP 1.2 (aunque todavía presentes en la 1.3 rama). Aquí's un no-explicación oficial.

No sé si la respuesta anterior hace básicamente lo mismo, pero algunos de nuestros sistemas de uso de la conexión DB aproximadamente una vez a la semana y he visto que nos proporcionan -Otimeout bandera o algo de ese tipo para mysql para establecer el tiempo de espera de conexión.

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