与DB的紧密连接不会关闭所有连接

时间:2011-02-22 08:38:29

标签: java sql database-connection datasource

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

1 个答案:

答案 0 :(得分:3)

我认为您的问题与this question有关C3P0有关。我想在Thread.sleep(delay)之前DataSources.destroy(dataSource)解决了您的问题。我还猜你知道有些连接完好无损,检查你的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);
            }
        }       
    }