`

DBCP 的validationQuery 解决数据库链接断开问题

阅读更多
本文转自:http://fhd001.iteye.com/blog/668282

网上很多评论说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,不会启动检查线程
分享到:
评论

相关推荐

    DBCP jar包 连接数据库必须用到的

    在实际应用中,还可以通过设置各种参数来优化DBCP的表现,比如设置验证查询(validationQuery)以检查连接的有效性,设置测试连接的时间间隔(testOnBorrow/testOnReturn)以确保每次获取的连接都是可用的。...

    DBCP的使用优化数据库的连接

    DBCP(Database Connection Pool)是Apache组织提供的一款开源的数据库连接池组件,它在Java应用中广泛使用,用于管理和优化数据库连接。通过使用DBCP,应用程序可以有效地复用数据库连接,减少创建和销毁连接的开销...

    DBCP数据库连接池包下载

    数据库连接池是将数据库连接作为对象进行管理,避免了频繁创建和关闭数据库连接带来的开销,有效地解决了数据库连接资源的浪费问题。 DBCP的核心功能包括: 1. **连接池管理**:DBCP维护了一个数据库连接池,当...

    DBCP配置数据库连接池

    - `validationQuery`: 验证查询语句,如`SELECT 1`。 3. **创建数据源**: 在Java代码中,通过Properties对象加载配置文件,然后创建BasicDataSource实例: ```java Properties props = new Properties(); ...

    批量读取excel文件并利用dbcp连接池写入数据库

    本话题主要涉及如何批量读取Excel文件,并利用DBCP连接池将数据写入数据库。这个过程涉及到几个关键知识点,包括Excel文件操作、数据库连接池的使用以及多线程处理。 首先,Excel文件操作通常使用Java中的Apache ...

    jdbc与dbcp数据库连接

    而DBCP(Jakarta DBCP,也称为Apache DBCP)是一个基于JDBC的数据库连接池组件,它能够有效地管理和复用数据库连接,从而提高应用性能。下面我们将详细探讨这两个概念以及它们如何协同工作。 **JDBC基础知识** ...

    dbcp数据库连接池

    **数据库连接池(DBCP)** 是一个在Java应用程序中管理数据库连接的工具,它能够有效地提高数据库操作的性能和效率。DBCP全称为`Jakarta Commons DBCP`,是Apache软件基金会的一个项目,提供了对数据库连接的池化...

    DBCP数据库连接池

    DBCP(Database Connection Pool)是Apache软件基金会的Commons DBCP项目提供的一款开源的数据库连接池组件。数据库连接池在Java应用中扮演着至关重要的角色,它通过维护一定数量的数据库连接,实现了数据库连接的...

    DBCP数据库连接池jar包.zip

    数据库连接池的出现解决了这个问题,它在应用程序启动时预创建一定数量的数据库连接,并存储在一个池中,当程序需要访问数据库时,可以从池中获取一个已经建立好的连接,使用完毕后再归还给池,而不是真正关闭连接。...

    DBCP连接数据库的jar包

    5. **性能优化**:DBCP允许通过配置参数来优化性能,例如设置合适的验证查询(validationQuery),在连接分配给客户端前检查其是否有效;设置测试连接的间隔时间(timeBetweenEvictionRunsMillis);以及自动回收...

    DBCP数据库连接池所需的3个jar包

    DBCP通过管理数据库连接,有效地解决了频繁创建和关闭数据库连接带来的性能问题,提高了系统效率并降低了资源消耗。在Java应用中,尤其是在服务器端的应用,数据库连接池是不可或缺的一部分。 在DBCP中,`commons-...

    dbcp数据库连接池使用jar包

    DBCP(DataBase Connection Pool)是Apache组织开发的一个开源数据库连接池组件,它是Java应用程序中用于高效管理数据库连接的重要工具。数据库连接池的概念是基于资源复用的原理,它避免了频繁地创建和销毁数据库...

    开源数据库连接池dbcp

    开源数据库连接池DBCP,全称为Jakarta-Commons-DBCP,是Apache软件基金会Jakarta项目中的一个组件,主要用于解决Java应用程序与数据库之间的连接管理问题。DBCP提供了一个高效且可配置的数据库连接池,使得多个...

    dbcp数据库连接池用到的jar包

    总之,DBCP是一个强大的数据库连接池实现,它通过Apache Commons Collections和Pool库的支持,为Java应用程序提供了高效的数据库连接管理。在Spring框架中整合DBCP,可以简化数据库连接的生命周期管理,提升应用性能...

    dbcp三个jar包 oralce数据库

    标题中的“dbcp三个jar包 oralce数据库”指的是在Java编程中使用...在实际项目中,还需要考虑兼容性问题,比如确认所使用的JDBC驱动和DBCP版本与Oracle数据库版本之间的匹配性,以及处理异常和关闭连接的最佳实践等。

    dbcp数据库连接池jar包

    DBCP是基于Apache的Commons Pool对象池设计模式实现的,用于管理和复用数据库连接,减少创建和销毁数据库连接时的开销。 首先,我们需要理解数据库连接池的工作原理。数据库连接池在初始化时会创建一定数量的数据库...

    DBCP连接池的最简单应用(用于ORACLE数据库)

    - 连接验证:可以通过设置validationQuery属性,对从池中取出的连接进行有效性验证。 - 空闲连接检测:可通过maxIdle和minEvictableIdleTimeMillis属性设定,定时检测并关闭空闲超时的连接。 - 连接池扩展性:...

    DBCP(数据库连接池)

    总的来说,DBCP作为一款老牌的数据库连接池工具,对于小型项目或者学习使用是足够的,但对于大型、高并发的应用场景,可能需要考虑更先进的解决方案。理解并掌握数据库连接池的工作原理和使用方法,对优化Java应用...

    java配置dbcp连接池(数据库连接池)示例分享

    Java配置DBCP连接池(数据库连接池)示例分享 Java配置DBCP连接池是Java应用程序中常用的数据库连接池实现之一。DBCP(Database Connection Pool)是Apache Commons提供的一种开源的数据库连接池实现,旨在提高Java...

    dbcp连接数据库

    同时,由于DBCP是开源的,社区对其支持良好,遇到问题时可以查阅相关文档或社区讨论找到解决方案。不过,随着技术的发展,如今更流行的数据库连接池有HikariCP、C3P0和Druid,它们在性能和功能上可能更具优势。

Global site tag (gtag.js) - Google Analytics