Depuis que j'ai ajouté Hibernate Search à mon application, il semble que je perde la connexion du pool d'Hikari après un certain temps (il semble que ce soit plus de 8 heures).
Cela fait une semaine que je suis confronté à cette erreur et je ne sais pas vraiment pourquoi elle se produit :
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not prepare statement
Caused by: org.hibernate.exception.GenericJDBCException: could not prepare statement
Caused by: java.sql.SQLException: Connection is closed
J'ai essayé : de définir les propriétés de certains hikari comme :
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimumIdle=20
spring.datasource.hikari.maximumPoolSize=100
spring.datasource.hikari.idleTimeout=300000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=200000
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.registerMbeans=true
pour configurer mon bean afin qu'il utilise une testQuery comme ci-dessous :
public DataSource siteDataSource() {
HikariConfig config = new HikariConfig();
HikariDataSource dataSource;
config.setJdbcUrl(env.getProperty("spring.mysql.datasource.url"));
config.setUsername(env.getProperty("spring.mysql.datasource.username"));
config.setPassword(env.getProperty("spring.mysql.datasource.password"));
config.setDriverClassName(env.getProperty("spring.mysql.datasource.driver-class-name"));
config.setMaximumPoolSize(15);
config.setConnectionTestQuery("SELECT 1");
// performance senstive settings
config.setMinimumIdle(0);
config.setConnectionTimeout(30000);
config.setIdleTimeout(35000);
config.setMaxLifetime(45000);
dataSource = new HikariDataSource(config);
return dataSource;
}
(les éléments de cette configuration ont également été supprimés et l'erreur est toujours la même)
et à utiliser :
autoReconnect=true
J'obtenais également l'erreur ci-dessous, qui semble avoir disparu avec l'implémentation actuelle (mais pour être honnête, je n'ai aucune idée de pourquoi - oui, je suis assez perdu ici) :
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: The last packet successfully received from the server was 50,090,585 milliseconds ago. The last packet sent successfully to the server was 50,090,585 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.
Je ne sais même pas comment reproduire cette erreur. Je dois attendre une journée entière pour le tester à nouveau à chaque nouveau test.
Il semble qu'il y ait quelque chose avec Tomcat + Hibernate + Hikari, mais pour être honnête, je n'ai pas d'autre idée.
Avez-vous une idée pour résoudre ce problème, ou même pour reproduire cette erreur sur une courte période de temps ?
Merci.