BasicDataSource basicDataSource = new BasicDataSource();
//初始化
try {
Connection conn = basicDataSource.getConnection();
//do something
conn.close();
System.out.println();
} catch (SQLException e) {
e.printStackTrace();
}
如上代码,在多线程环境下会出现连接关闭的问题。主要是原因是dbcp1和dbcp2版本不一致造成的。
private class PoolGuardConnectionWrapper extends DelegatingConnection {
private Connection delegate;
public void close() throws SQLException {
if (delegate != null) {
this.delegate.close();
this.delegate = null;
super.setDelegate(null);
}
}
}
如上,dbcp1的Connection代理类直接调用java.sql.Connetion的close。这样连接复用的时候就会出现问题。
而dbcp2的代理类又包了一层,close的时候会判断连接是否被使用
private class PoolGuardConnectionWrapper<D extends Connection> extends DelegatingConnection<D> {
public void close() throws SQLException {
if (this.getDelegateInternal() != null) {
super.close();
super.setDelegate((Connection)null);
}
}
}
总结:dbcp1,推荐不关闭连接,使用本身的连接池的配置,让连接池来关闭无用的连接。dbcp2可以手动close