Ich habe eine Grails-App, die hohe Aktivität hat, aber dann oft Perioden der Inaktivität, die dauern kann mehrere Stunden bis über Nacht. Ich stelle fest, dass die ersten Benutzer am Morgen die folgende Art von Ausnahme erhalten, und ich glaube, dass dies aufgrund der Verbindungen in dem Pool, der veraltet ist, und der MYSQL-Datenbank, die sie schließt, ist.Richtiger Weg, um gepoolte Verbindungen während längerer Inaktivität für MySQL aufrechtzuerhalten, Grails 2 App
Ich habe in Googling widersprüchliche Informationen darüber gefunden, ob die Verwendung der Connector/J-Verbindungseigenschaft 'autoReconnect = true' sinnvoll ist (und ob der Client immer noch eine Ausnahme erhält, selbst wenn die Verbindung wiederhergestellt wird). oder ob andere Eigenschaften eingestellt werden sollen, die inaktive Verbindungen periodisch löschen oder auffrischen, auf Ausleihungen usw. testen. Grails verwendet DBCP darunter. Ich habe derzeit eine einfache Konfiguration wie unten, und bin auf der Suche nach einer Antwort darauf, wie man am besten sicherstellen, dass jede Verbindung, die aus dem Pool nach einer langen inaktiven Periode ergriffen wurde, gültig und nicht geschlossen ist.
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?
}
}
Exception
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)
Danke für den Link, irgendwie verpasst die Seite, indem Sie direkt auf die javadocs. Ich werde eine Kombination von diesen implementieren und sehen, wie es funktioniert. – Peter
Leider hat DBCP immer noch keine Konfiguration, um das Alter der Verbindung oder die Anzahl der Verbindungsversuche zu begrenzen, bevor sie aus dem Pool entfernt wird. (Andere Implementierungen von Verbindungspools tun dies.) – spencer7593
obwohl, Spencer7593, das sollte keine Rolle spielen, wenn die Verbindungen verwendet werden, oder geräumt/aktualisiert, wenn sie durch Inaktivität schlecht werden, denke ich, da es keinen Einfluss auf den Benutzer hat. – Peter