J'utilise c3p0 pour mon pool de connexion. Le ComboPooledDataSource que j'utilise est configuré comme ci-dessous.Quelle est la meilleure façon de fermer les connexions et d'éviter les sessions inactives lors de l'utilisation de C3P0?
@Bean
public DataSource dataSource() {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("user");
dataSource.setDriverClass("oracle.jdbc.OracleDriver");
dataSource.setJdbcUrl("test");
dataSource.setPassword("test");
dataSource.setMinPoolSize("10");
dataSource.setMaxPoolSize("20");
dataSource.setMaxStatements("100");
return dataSource;
}
Je suis confronté à des problèmes avec ceci. J'ai des avertissements que cela pourrait fuir les connexions. Également l'erreur ci-dessous de temps en temps,
comme toutes les connexions sont utilisées.
java.sql.SQLException: Io exception: Got minus one from a read call
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection
(WrapperConnectionPoolDataSource.java:182)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection
(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource
(C3P0PooledConnectionPool.java:137)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
Et à partir de la base de données DB, pouvait voir près de 290 connexions inactives. J'ai environ 8 applications déployées dans deux serveurs,
se connectant au même DB.
Mes requêtes sont
- Comment puis-je assurer que les connexions sont fermées e et de ne pas avoir ces nombreuses connexions inactives?
- La configuration du temps d'inactivité et du délai d'attente permet-elle de résoudre ce problème? Que se passerait-il si le serveur est arrêté/si Tomcat est arrêté, les connexions resteront-elles ouvertes?
- Les connexions sont principalement utilisées lors du démarrage pour charger le cache, donc est-il possible de ne plus utiliser ces connexions par la suite?
- Que faire pour les connexions inactives existantes?