【问题标题】:Does DBCP connection pool connection.close() return connection to poolDBCP 连接池 connection.close() 是否将连接返回到池
【发布时间】:2015-03-28 09:32:58
【问题描述】:

如果我们执行 getConnection() 并在 finally 块中关闭连接,则使用 DBCP 中的 BasicDataSource 是它真的将连接返回到池还是关闭连接。我正在检查的 sn-p 代码是这样的

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 的一个已知问题还是我读错了源代码,请告诉我。

谢谢

【问题讨论】:

  • 您正在关闭连接...为什么要这样做?
  • 如果我不关闭连接,池会在达到 maxActive 限制后抛出错误。我只是在检查这个,因为我读到如果我们关闭连接池中的连接,连接包装器而不是关闭连接会将其放回池中。但是从源代码我不能推断出相同的

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


【解决方案1】:

你最终会调用PoolableConnection.close(),它将它返回到池中。

【讨论】:

  • 感谢我在阅读源代码时搞砸了!现在说得通了
  • 作为Connection extends AutoCloseable,您可以使用try-with-resource 块,在退出try (Connection conn = ... ) { } 块时将调用conn.close(),这确实会将连接返回到池,但是没有 实际上在池和数据库之间关闭它。
猜你喜欢
  • 2012-06-14
  • 2019-03-03
  • 2012-12-22
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2012-07-03
相关资源
最近更新 更多