Правильный способ поддерживать соединения в пуле (или прерывать их и получать новые) при длительном бездействии для MySQL, приложение Grails 2

У меня есть приложение Grails, в котором бывают периоды высокой активности, но затем часто бывают периоды бездействия, которые могут длиться от нескольких часов до ночи. Я заметил, что первые пользователи утром получают исключение следующего типа, и я полагаю, что это связано с тем, что соединения в пуле устаревают, а база данных MYSql их закрывает.

В Google я нашел противоречивую информацию о том, является ли хорошей идеей использование свойства соединения Connector/J '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)
37
задан Charles 20 June 2012 в 21:04
поделиться