SpringBoot:GenericJDBCException: l'Impossibilité d'acquérir la Connexion JDBC
Je suis de la connexion à la base mysql par la création de la source de données de façon dynamique avec les propriétés suivantes, Sa fonctionne très bien, mais après un certain temps, il continue de me donner le message d'erreur "Impossible d'acquérir la Connexion JDBC".
package com.test.db;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import java.util.HashMap;
@Configuration
@EnableJpaRepositories(basePackages = "com.test.master", entityManagerFactoryRef = "userMasterEntityManager", transactionManagerRef = "userMasterTransactionManager")
public class MasterDBConfig {
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean userMasterEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "com.test.master" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "create");
properties.put("hibernate.id.new_generator_mappings", "false");
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.put("hibernate.testOnBorrow", "true");
properties.put("hibernate.validationQuery", "SELECT 1");
properties.put("hibernate.testWhileIdle", "true");
// properties.put("hibernate.timeBetweenEvictionRunsMillis", "3600000");
properties.put("hibernate.connection.autoReconnect", "true");
properties.put("hibernate.connection.autoReconnectForPools", "true");
em.setJpaPropertyMap(properties);
return em;
}
@Primary
@Bean(name = "dataSource")
public DataSourceRouter dataSource() {
return new DataSourceRouter();
}
@Primary
@Bean
public PlatformTransactionManager userMasterTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(userMasterEntityManager().getObject());
return transactionManager;
}
}
Son été hébergé dans AWS avec Tomcat de l'environnement. DB est dans RDS de AWS.
Mise à JOUR:
Causés par:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873)
at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1710)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor39.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:732)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:664)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:479)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:154)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131)
- Pouvez-vous partager le plein journal de suivi pour la question
- Qarabsa, a ajouté la cause racine.
- MySQLNonTransientConnectionException: Trop de connexions, cela signifie que vous avez beaucoup de rapports, probablement, vous n'êtes pas la fermeture de sessions ouvertes
- Ok, pouvez-vous svp me guider comment puis-je le faire ?
Vous devez vous connecter pour publier un commentaire.
Ce que j'ai appris de vos stacktrace, vous avez des problème avec le trop grand nombre de connexions qui conduit à l'indisponibilité pour établir de nouvelles connexions.La solution est assez simple - vous avez de la connexion de la configuration de la piscine(c3p0 est très populaire) et de spécifier pool de connexions.
Voir cette configuration de c3p0 et de connexion de base des tweak
aussi ne pas oublier de inclure la dépendance pour que
Bonne Chance
Pour moi, le problème a été résolu en faisant en sorte que toutes les sessions sont fermées adéquatement immédiatement après l'utilisation.