DBCP是apache下面的一个开源的数据库连接池,谈谈几个经验
1 Connection出问题后的释放
Connection建立成功后,如果在某次操作的时候,连接本身出现异常,可能需要废弃掉这个连接,创建新连接。当然对于mysql,支持autoReconnect的则不存在问题(Connection本身不需要废弃),但是如果不支持autoReconnect的driver,就存在这个问题。DBCP中使用的是PoolableConnection,关闭的时候,判断PoolableConnection是否close,因为这个PoolableConnection上还有代理,所以不会重复关闭,那么就判断底层的Connection的isClosed是否为true,如果是true,那么就会丢弃这个连接。JDK中Connection接口的isClosed只在Connection.close被调用后为true,在Driver的实现上,产生和数据库连接的异常后,Driver必须要自己调用close方法,才能保证这个地方让DBCP去丢弃连接。另外就是在close的时候,还调用了ConnectionFactory的passiveObject方法,这个地方出异常也会导致连接被丢弃掉。
2 关于Idle
默认DBCP的minIdle和maxIdle都是-1,设置以后的话,对于maxIdle,如果maxIdle小于maxActive,那么在调用returnObject的时候,如果当前的idle已经等于maxIdle了,会释放掉这个连接。
3 evict
如果设置了evict的time,那么会启动一个evictor的线程,这个是对idle的object进行检查的。基本上的逻辑是验证idle的object,删除idle超时的object,然后要保证idle的数量到达minIdle的值。