网上很多评论说DBCP有很多BUG,但是都没有指明是什么BUG,只有一部分人说数据库如果因为某种原因断掉后再DBCP取道的连接都是失效的连接,而没有重新取。就此研读了一下DBCP的代码,共享之。
分析
DBCP使用apache的对象池ObjectPool作为连接池的实现,有以下主要的方法
Object borrowObject() throws Exception;从对象池取得一个有效对象
void returnObject(Object obj) throws Exception;使用完的对象放回对象池
void invalidateObject(Object obj) throws Exception;使对象失效
void addObject() throws Exception;生成一个新对象
ObjectPool的一个实现就是GenericObjectPool,这个类使用对象工厂PoolableObjectFactory实现对象的生成,失效检查等等功能,以其实现数据库连接工厂PoolableConnectionFactory做以说明,主要方法:
Object makeObject() throws Exception; 使用ConnectionFactory生成新连接
void destroyObject(Object obj) throws Exception;关闭连接
boolean validateObject(Object obj); 验证连接是否有效,如果_validationQuery不空,则使用该属性作为验证连接是否有效的sql语句,查询数据库
void activateObject(Object obj) throws Exception;激活连接对象
void passivateObject(Object obj) throws Exception; 关闭连接生成过的Statement和ResultSet,使连接处于非活动状态
而GenericObjectPool有几个主要属性
_timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,默认-1
_maxIdle:对象池中对象最大个数
_minIdle:对象池中对象最小个数
_maxActive:可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8
在构造GenericObjectPool时,会生成一个内嵌类Evictor,实现自Runnable接口。如果_timeBetweenEvictionRunsMillis大于0,每过_timeBetweenEvictionRunsMillis毫秒Evictor会调用evict()方法,检查对象的闲置时间是否大于 _minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0时则忽略,默认为30分钟),是则销毁此对象,否则就激活并校验对象,然后调用ensureMinIdle方法检查确保池中对象个数不小于_minIdle。在调用returnObject方法把对象放回对象池,首先检查该对象是否有效,然后调用PoolableObjectFactory 的passivateObject方法使对象处于非活动状态。再检查对象池中对象个数是否小于_maxIdle,是则可以把此对象放回对象池,否则销毁此对象
还有几个很重要的属性,_testOnBorrow、_testOnReturn、_testWhileIdle,这些属性的意义是取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证。所以当使用DBCP时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了。网上很多说DBCP的bug应该都是如此吧,只有把这些属性设为true,再提供_validationQuery语句就可以保证数据库连接始终有效了,oracle数据库可以使用SELECT COUNT(*) FROM DUAL,不过DBCP要求_validationQuery语句查询的记录集必须不为空,可能这也可以算一个小小的BUG,其实只要_validationQuery语句执行通过就可以了。
注意事项
所以使用DBCP连接池放必须注意构造GenericObjectPool对象时
validationQuery:SELECT COUNT(*) FROM DUAL
_testOnBorrow、_testOnReturn、_testWhileIdle:最好都设为true
_minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证
_timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fgakjfd/archive/2010/05/17/5600462.aspx
分享到:
相关推荐
例如,`maxActive`设置最大活动连接数,`testOnBorrow`控制在获取连接前是否进行验证,`validationQuery`用于执行SQL语句检查连接的有效性。 5. **性能优化**:为了提高性能,应合理设置连接池参数,如适当增加`...
例如,可以设置`validationQuery="SELECT 1"`来验证连接是否仍然可用,并启用`testWhileIdle`来定期测试空闲连接。 2. **限制连接空闲时间**:通过`minEvictableIdleTimeMillis`来控制连接在空闲多长时间后被回收...
DBCP连接池还有一些其他可配置的参数,例如`maxWait`(最大等待时间),`validationQuery`(用于验证连接是否有效的SQL查询),`testOnBorrow`和`testOnReturn`(在借用或归还连接时是否执行验证)。这些参数可以...
- `validationQuery`:用于验证连接是否有效的SQL查询。 在应用启动时,DBCP会根据配置初始化连接池,然后应用可以通过DataSource接口获取到数据库连接。使用完毕后,必须将连接返回到池中,以便其他线程可以复用。...
- **validationQuery**:用于验证数据库连接是否有效的SQL查询语句,如`SELECT 1`。 - **testOnBorrow**:在从池中获取连接时是否进行验证。 - **testOnReturn**:在连接归还到池时是否进行验证。 - **...
validationQuery="select count(*) from bt_user" logAbandoned="true" /> ``` 4.2 参数分步介绍 - `username`和`password`:数据库的用户名和密码。 - `driverClassName`:指定数据库驱动,这里是Oracle JDBC...
- 使用连接池的验证机制,如`validationQuery`,定期检查连接有效性,防止因连接长时间未使用而失效。 - 注意关闭不再使用的Statement和ResultSet,避免资源泄露。 6. **与其他连接池的比较**: - DBCP相比于C3P...
例如,适当增加`maxActive`限制,减少`maxIdle`,设置合理的`validationQuery`进行连接有效性检查等。 总之,Apache Commons DBCP 1.3是一个可靠的数据库连接池解决方案,适用于那些对性能有一定要求但又不追求极致...
`validationQuery`属性可以设置一个SQL查询语句,当连接被取出使用前会执行这个查询以验证连接是否正常。 7. **异常处理与连接回收**:如果应用在使用连接时发生异常,DBCP能够自动检测并回收问题连接,防止资源...
6. **validationQuery**:用于验证连接的SQL语句。 **DBCP的使用**: 在Java应用中使用DBCP,首先需要添加Apache Commons DBCP的依赖库,然后创建DataSource对象,设置相关配置,最后通过DataSource获取Connection...
- `validationQuery`:用于验证连接的SQL查询。 5. **使用DBCP步骤**: - 引入DBCP的jar包,包括`commons-dbcp.jar`和`commons-pool.jar`。 - 创建`BasicDataSource`实例并设置配置属性。 - 从`BasicDataSource...
6. **ValidationQuery**: DBCP支持配置一个验证查询,每次从池中取出连接时,会执行这个查询以检查连接是否仍有效。这有助于发现并处理由于网络问题或其他原因导致的死连接。 使用DBCP jar包时,开发者需要在Java...
- `validationQuery`:用于验证连接是否有效的SQL查询语句。 **使用DBCP的步骤:** 1. 添加依赖库到项目中,如上述的三个JAR文件。 2. 配置DBCP的属性,例如在`dbcp.properties`文件中。 3. 创建`BasicDataSource`...
3. **验证查询**:`testOnBorrow`和`testOnReturn`分别控制在借用和归还连接时是否进行有效性验证,`validationQuery`是用于验证连接的SQL语句,如"SELECT 1"。 除了`BasicDataSource`,DBCP还包含其他组件,如`...
5. **性能优化**:DBCP允许通过配置参数来优化性能,例如设置合适的验证查询(validationQuery),在连接分配给客户端前检查其是否有效;设置测试连接的间隔时间(timeBetweenEvictionRunsMillis);以及自动回收...
5. **ValidationQuery**: DBCP允许设置一个验证查询,每次从池中获取连接时都会执行这个查询,确保连接的有效性。 6. **ConnectionFactory**: 这个接口用于创建原始的JDBC Connection。通常,我们会通过实现这个...
- `validationQuery`:用于验证连接是否有效的SQL查询。 除了DBCP本身,压缩包中的另外两个库文件也很重要: - **commons-collections-3.2.1.jar**:Apache Commons Collections库,提供了丰富的集合操作和算法,...
这通过`ValidationQuery`和`Validator`实现,用户可以自定义验证查询语句或提供自定义验证器。 6. **异常处理** 当连接池中的连接出现异常时,DBCP2有完善的异常处理机制。例如,如果一个连接在使用过程中抛出异常...
9. **validationQuery**:用于验证连接是否有效的SQL查询,如MySQL的`SELECT 1`。 **使用DBCP的步骤**: 1. 添加依赖:确保在项目中引入了DBCP的jar文件。 2. 配置连接池:创建一个XML配置文件,设置上述提到的...
- `validationQuery`: 验证查询语句,如`SELECT 1`。 3. **创建数据源**: 在Java代码中,通过Properties对象加载配置文件,然后创建BasicDataSource实例: ```java Properties props = new Properties(); ...