2012-08-14 11 views
5

Tengo una aplicación configurada para agrupar las conexiones de MySQL con BoneCP. En este momento, la aplicación no está recibiendo mucho uso, por lo que las conexiones no se utilizan con tanta frecuencia. Después de una cierta cantidad de tiempo, las consultas que trabajaron una vez, comienzan a fallar, y reciben mensajes similares a este:Java BoneCP conexión MySQL tiempo de espera

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 2,618,063 milliseconds ago.  The last packet sent successfully to the server was 44,734 milliseconds ago. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3567) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379) 
at com.jolbox.bonecp.PreparedStatementHandle.execute(PreparedStatementHandle.java:138) 

Estoy fijando BoneCP como esto:

BoneCPConfig config = new BoneCPConfig(); 
config.setJdbcUrl("jdbc:mysql://" + hostname + "/" + database); 
config.setUsername(username); 
config.setPassword(password); 
config.setMinConnectionsPerPartition(minPoolSize); 
config.setMaxConnectionsPerPartition(maxPoolSize); 
config.setIdleConnectionTestPeriodInMinutes(60); 
config.setIdleMaxAgeInMinutes(240); 
config.setPartitionCount(1); 
connectionPool = new BoneCP(config); 

estoy seguro de cómo averiguar cuál es el tiempo de espera para el servidor mysql (no se ha cambiado de lo que sea el predeterminado), pero aparece este error después de alrededor de 5 o 10 minutos sin actividad de grupo de conexiones, lo que parece extremadamente corto.

Respuesta

5

O tendrá que configurar mysqls tiempo de inactividad (ajuste wait_timeout = X/interactive_timeout = X), o se puede configurar la agrupación de conexiones para emitir keep-alive declaraciones:

config.setIdleConnectionTestPeriodInMinutes(10); 
config.setConnectionTestStatement("/* ping */ SELECT 1"): 
+0

Gracias por la mantener- parte de la declaración viva, y los nombres de las variables para el tiempo de espera inactivo Mysql. Los revisé a los dos, y ambos están en el valor predeterminado de 8 horas. Y en este momento en las pruebas que he estado haciendo, el programa solo ha estado ejecutando un máximo de 30 minutos a una hora. ¡Probaré las declaraciones de keep-alive y te lo haré saber! – Nick

+0

¡Esto parece haber solucionado el problema! ¡Gracias! – Nick

Cuestiones relacionadas