DBCP连接池connection.close()是否返回到池的连接

时间:2015-01-29 08:20:21

标签: java database-connection connection-pooling apache-commons-dbcp

如果我们执行getConnection(),则使用DBCP中的BasicDataSource,在finally块中我们关闭连接,它确实会返回到池的连接或关闭连接。我正在检查的代码段是

try {
        Connection conn1 = getJdbcTemplate().getDataSource()
                .getConnection();
        //Some code to call stored proc 

    } catch (SQLException sqlEx) {
        throw sqlEx;
    } finally {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException ex1) {
            throw ex1;
        }

    }

我正在检查BasicDataSource的源代码,我到达了这个连接的包装类。

private class PoolGuardConnectionWrapper extends DelegatingConnection {

    private Connection delegate;

    PoolGuardConnectionWrapper(Connection delegate) {
        super(delegate);
        this.delegate = delegate;
    }

    public void close() throws SQLException {
        if (delegate != null) {
            this.delegate.close();
            this.delegate = null;
            super.setDelegate(null);
        }
    }

类型为java.sql.Connection的委托对象。包装器代码调用委托的close方法,该方法将关闭集合而不是将连接返回到池。这是DBCP的已知问题,还是我错误地阅读了源代码,请告诉我。

由于

1 个答案:

答案 0 :(得分:5)

您最终会调用PoolableConnection.close(),然后将其返回到游泳池。