【发布时间】: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