【问题标题】:Close connection to DB does not close all connections关闭与数据库的连接不会关闭所有连接
【发布时间】:2011-02-22 08:38:28
【问题描述】:

我的代码中存在与数据库的连接泄漏。 有趣的是,当我调试时,所有连接都成功关闭(或者当我执行 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);
                }
            }       
        }

【问题讨论】:

  • 如何检查连接是否仍然打开?您似乎正在使用连接池,因此,如果您的应用程序将它们全部关闭时您的数据库仍在报告打开的连接,那可能是正确的(因为池可能会保持一些连接打开,以防您的应用程序中需要另一个连接)。
  • 谢谢。我检查连接是否仍然在数据库中使用 sql 查询打开。它是否与“打开连接”与“关闭连接”非常接近这一事实有关?

标签: java sql database-connection datasource


【解决方案1】:

我认为您的问题与 C3P0 的 this question 有关。我猜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);
            }
        }       
    }

【讨论】:

  • 谢谢!这解决了问题 - 分配连接变量并明确释放它。
猜你喜欢
  • 2013-10-07
  • 2019-01-04
  • 1970-01-01
  • 2011-06-25
  • 2011-10-19
  • 2013-10-16
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多