Ho un'app di Grails che ha raffiche di attività elevata, ma spesso periodi di inattività che possono durare diverse ore per tutta la notte. Ho notato che i primi utenti del mattino ottenere il seguente tipo di eccezione, e credo che questo sia dovuto alle connessioni nel pool di database che vanno stantio e mysql chiuderli.Modo corretto per mantenere vivi i collegamenti in pool (o crearli e recuperarli) durante l'inattività più lunga per MySQL, app Grails 2
Ho trovato informazioni in conflitto su Google se utilizzare la proprietà di connessione Connector/J 'autoReconnect = true' è una buona idea (e se il client otterrà comunque un'eccezione anche se la connessione viene ripristinata), oppure se impostare altre proprietà che periodicamente sgomberare o rinfrescare connessioni inattive, test prestito, ecc Grails utilizza DBCP sotto. Al momento ho una semplice configurazione, come di seguito, e sono alla ricerca di una risposta su come garantire meglio che qualsiasi connessione afferrato fuori dalla piscina, dopo un lungo periodo di inattività è valido e non chiuso.
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?
}
}
Eccezione
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)
Grazie per il link, riesce a sbagliare anche quella pagina andando direttamente alle javadoc. Implementerò una combinazione di quelli e vedremo come funziona. – Peter
Purtroppo, DBCP non ha ancora una configurazione per limitare l'età della connessione, o il numero di volte che una connessione viene utilizzato, prima di essere sfrattato dalla piscina. (Altre implementazioni dei pool di connessione.) – spencer7593
sebbene, spencer7593, che non dovrebbe importare se le connessioni vengono utilizzate, o sfrattate/aggiornate quando vanno male dall'inattività, penso, in quanto non avrà alcun impatto sull'utente. – Peter