dbcp 出现的connection is closed的问题

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 extends DelegatingConnection {
        public void close() throws SQLException {
            if (this.getDelegateInternal() != null) {
                super.close();
                super.setDelegate((Connection)null);
            }

        }
}

总结:dbcp1,推荐不关闭连接,使用本身的连接池的配置,让连接池来关闭无用的连接。dbcp2可以手动close

你可能感兴趣的:(Java,dbcp,closed)