我的代码中存在与数据库的连接泄漏。 有趣的是,当我调试时,所有连接都成功关闭(或者当我执行 Thread.Sleep(100) 时)。但如果没有这一点,总会有一种联系存在! 你能告诉我这里出了什么问题吗?
ComboPooledDataSource dataSource = null;
try {
dataSource = dataSourceFactory.getDataSource(dbType, dbProps);
dataSource.getConnection();
} finally {
if (dataSource != null)
{
try
{
log.debug("validate() : Closing SQL connection pool");
DataSources.destroy(dataSource);
dataSource = null;
log.debug("validate() : SQL connection pool is closed");
}
catch (Exception e)
{
log.error("validate() : Error closing data source", e);
}
}
}
最佳答案
我认为您的问题与 this question 有关关于C3P0。我想在 DataSources.destroy(dataSource)
之前使用 Thread.sleep(delay)
可以解决您的问题。我还猜测您通过检查 MySQL 日志知道某些连接完好无损。但是,除了您的情况之外,我建议手动关闭数据源之外的连接,这是每次使用它后都要执行的操作。所以我建议进行以下修改:
ComboPooledDataSource dataSource = null;
Connection connection = null;
try {
dataSource = dataSourceFactory.getDataSource(dbType, dbProps);
// Get a connection from the datasource
connection = dataSource.getConnection();
} finally {
if (connection!=null){
connection.close();
}
if (dataSource != null) {
try {
log.debug("validate() : Closing SQL connection pool");
DataSources.destroy(dataSource);
dataSource = null;
log.debug("validate() : SQL connection pool is closed");
} catch (Exception e) {
log.error("validate() : Error closing data source", e);
}
}
}
关于java - 关闭与数据库的连接并不会关闭所有连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5075824/