conexiones java mysql tomcat jdbc connection-pooling

java - conexiones - Tomcat JDBC Conencton Pool+MySQL ofrece problemas de "tubería rota", incluso con validación de conexión



tomcat datasource config (2)

Debe establecer ''testOnBorrow'' en ''true'', y probablemente ''maxAge'' en menos que el configurado en el servidor ''wait_timeout'', como se insinuó en el mensaje.

Estoy luchando con la configuración de Tomcat JDBC Connection Pool para lograr confiabilidad. El problema actual es que en el entorno de prueba tengo dicho scanerio en webapp:

  • día 1: todo funciona bien
  • día 2: webapp no ​​puede comunicarse con MySQL durante varias horas, mucho de "tubería rota" en los registros
  • día 3: sorprendentemente, todo funciona bien de nuevo (sin ingerencia ni reinicio)

He configurado validationInterval , validationQuery , validationTimeout . Esta es mi configuración de fuente de datos:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="${dbUser}" /> <property name="password" value="${dbPass}" /> <property name="url" value="${dbUrl}" /> <property name="defaultAutoCommit" value="false" /> <property name="defaultTransactionIsolation"> <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE" /> </property> <property name="maxActive" value="300" /> <property name="maxIdle" value="25" /> <property name="initialSize" value="5" /> <property name="validationInterval" value="5000" /> <property name="validationQuery" value="SELECT 1"/> <property name="validationQueryTimeout" value="3" /> <property name="minIdle" value="5" /> <property name="initSQL" value="SET time_zone = ''+00:00'';" /> </bean>

No tengo el parámetro autoReconnect=true en la URL de conexión, solo la codificación UTF8.

El error exacto es:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 38,700,615 milliseconds ago. The last packet sent successfully to the server was 38,700,615 milliseconds ago. is longer than the server configured value of ''wait_timeout''. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property ''autoReconnect=true'' to avoid this problem. Caused by: java.net.SocketException: Broken pipe


Tuvimos algunos problemas similares con una de nuestras aplicaciones y después de excavar mucho agregamos las siguientes propiedades que resolvieron todos nuestros problemas de conexión:

maxAge="180000" testOnBorrow="true" testWhileIdle="true" validationInterval="0" //forces the connection pool to validate each time a connection is given to the application