У меня есть приложение grails, в котором есть потоки высокой активности, но часто это периоды бездействия, которые могут длиться несколько часов до ночи. Я заметил, что первые пользователи получают следующий вид исключения, и я считаю, что это связано с тем, что соединения в пуле становятся устаревшими, а база данных MYSql закрывает их.
Я нашел противоречивую информацию в Googling о том, является ли использование свойства Connector/J connection 'autoReconnect = true' хорошей идеей (и будет ли клиент по-прежнему получать исключение, даже если соединение будет восстановлено), или устанавливать ли другие свойства, которые будут периодически выселять или обновлять незанятые соединения, тестировать по заимствованиям и т.д. Grails использует DBCP снизу. В настоящее время у меня есть простая конфигурация, как показано ниже, и я ищу ответ на вопрос о том, как наилучшим образом гарантировать, что любое соединение, извлеченное из пула после длительного неактивного периода, будет действительным и не будет закрыто.
dataSource {
pooled = true
dbCreate = "update"
url = "jdbc:mysql://my.ip.address:3306/databasename"
driverClassName = "com.mysql.jdbc.Driver"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
username = "****"
password = "****"
properties {
//what should I add here?
}
}
Исключение
2012-06-20 08:40:55,150 [http-bio-8443-exec-1] ERROR transaction.JDBCTransaction - JDBC begin failed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 64,129,968 milliseconds ago. The last packet sent successfully to the server was 64,129,968 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.
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3851)
...... Lots more .......
Caused by: java.sql.SQLException: Already closed.
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)