Prawidłowy sposób na podtrzymywanie połączeń w puli (lub ich czasowe i otrzymywanie nowych) podczas dłuższej nieaktywności dla MySQL, aplikacja Grails 2

Mam aplikację Grails, która charakteryzuje się dużą aktywnością, ale często okresami braku aktywności, które mogą trwać od kilku godzin do nocy. Zauważyłem, że pierwsi użytkownicy rano otrzymują następujący typ wyjątku i wierzę, że wynika to z nieaktualnych połączeń w puli i zamknięcia bazy danych MYSql.

W Googlingu znalazłem sprzeczne informacje na temat tego, czy użycie właściwości połączenia / autoReconnect = true jest dobrym pomysłem (i czy klient nadal będzie uzyskiwał wyjątek, nawet jeśli połączenie zostanie przywrócone) lub czy ustawić inne właściwości, które okresowo eksmitują lub odświeżają bezczynne połączenia, testują pożyczanie itp. Grails używa DBCP poniżej. Obecnie mam prostą konfigurację, jak poniżej, i szukam odpowiedzi na pytanie, jak najlepiej zapewnić, że każde połączenie wyłapane z puli po długim nieaktywnym okresie jest ważne i nie zamknięte.

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?
          }
    }

Wyjątek

    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)

questionAnswers(2)

yourAnswerToTheQuestion