`
yangzb
  • 浏览: 3506562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DBCP代码研读以及就数据库连接失效的解决

阅读更多

问题

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

分享到:
评论
1 楼 yangzb 2011-03-31  
Apache-DBCP
dataSource: 要连接的 datasource (通常我们不会定义在 server.xml)
defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true
defaultReadOnly: 对于数据库是否只能读取, 默认值为 false
driverClassName:连接数据库所用的 JDBC Driver Class,
maxActive: 可以从对象池中取出的对象最大个数,为0则表示没有限制,默认为8
maxIdle: 最大等待连接中的数量,设 0 为没有限制 (对象池中对象最大个数)
minIdle:对象池中对象最小个数
maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息
password: 登陆数据库所用的密码
url: 连接数据库的 URL
username: 登陆数据库所用的帐号
validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned: 是否自我中断, 默认是 false
removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true
logAbandoned: 是否记录中断事件, 默认为 false
minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证;默认30分钟
timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程,默认-1
testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为false
testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为false
testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为false

在使用DBCP的时候,如果使用默认值,则数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际上就会是无效的数据库连接。因此为了防止获得的数据库连接失效,在使用的时候最好保证:
username: 登陆数据库所用的帐号
validationQuery:SELECT COUNT(*) FROM DUAL
testOnBorrow、testOnReturn、testWhileIdle:最好都设为true
minEvictableIdleTimeMillis:大于0 ,进行连接空闲时间判断,或为0,对空闲的连接不进行验证
timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程

相关推荐

    DBCP数据库连接池包下载

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

    DBCP数据库连接池jar包.zip

    DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,主要目的是为了提高数据库连接的复用性,减少创建和销毁连接的开销,从而提升应用的性能。DBCP2是其第二个主要版本,提供了更稳定...

    DBCP配置数据库连接池

    DBCP(Database Connection Pool)是Apache软件基金会的Commons项目中的一个组件,它提供了一个数据库连接池服务。数据库连接池在应用服务器启动时创建一定数量的数据库连接,并将这些连接放入池中,当应用程序需要...

    DBCP数据库连接池

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

    dbcp数据库连接池

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

    jdbc与dbcp数据库连接

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

    DBCP,C3P0数据库连接池jar包

    数据库连接池(Database Connection Pool)是Java应用中用于管理数据库连接的一种技术,它能有效地解决数据库连接创建和释放过程中的性能问题。DBCP(Jakarta DBCP)和C3P0是两种常用的数据库连接池实现,它们在提高...

    dbcp数据库连接池使用jar包

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

    dbcp数据库连接池jar包

    3. 获取数据库连接:在代码中,我们可以通过Spring框架或者其他方式来获取配置好的数据源,并从中获取数据库连接。例如,使用Spring的`@Autowired`注解: ```java @Autowired private DataSource dataSource; ...

    DBCP(数据库连接池)

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

    开源数据库连接池dbcp

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

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

    整合完成后,Spring应用程序就可以通过@Autowired注解或ApplicationContext来注入这个DataSource,从而获取到数据库连接,执行SQL语句。 总之,DBCP是一个强大的数据库连接池实现,它通过Apache Commons ...

    利用dbcp实现数据库连接池

    4. **连接生命周期管理**:DBCP会自动管理连接的生命周期,包括创建连接、验证连接有效性、回收空闲连接以及关闭长时间未使用的连接。 5. **连接池的初始化**:在应用启动时,我们需要初始化DataSource,这通常在...

    数据库连接池java代码实现

    总结来说,数据库连接池通过Java代码实现的核心包括连接池的初始化、连接的获取与释放、以及资源的管理和监控。通过自定义连接池,我们可以控制连接的生命周期,优化资源使用,从而提高应用的性能和稳定性。在实际...

    数据库连接池dbcp和c3p0jar包

    "数据库连接池dbcp和c3p0jar包"这个压缩包包含了这两个库的JAR文件,开发者可以解压并导入到自己的项目中,然后通过简单的代码配置来启用数据库连接池服务。例如,使用Spring框架,可以在配置文件中声明数据源,指定...

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

    DBCP(Database Connection Pool)是Apache软件基金会提供的一个开源数据库连接池组件,它基于Jakarta Commons DBCP项目。在Java应用中,数据库连接池是一个非常重要的组件,它能够有效地管理数据库连接,提高应用...

    使用DBCP创建MySQL数据库连接池

    DBCP(Database Connection Pool)是Apache Commons的一个子项目,提供了数据库连接池的实现。本篇文章将详细介绍如何使用DBCP来创建一个针对MySQL数据库的连接池。 首先,我们需要了解DBCP的基本概念。DBCP全称为...

    数据库连接池DBCP,jar包

    数据库连接池(DBCP)是Java应用中用于管理数据库连接的一种技术,它允许应用程序重复使用已建立的数据库连接,而不是每次需要访问数据库时都创建新的连接。这样可以显著提高应用程序的性能,减少系统资源的消耗,并...

    DBCP数据库连接池jar包

    DBCP,全称为Apache Database Connection Pool,是由Apache软件基金会开发的一款开源数据库连接池组件。它在Java应用程序中扮演着至关重要的角色,通过有效地管理和复用数据库连接,显著提高了数据库访问性能,同时...

    dbcp.rar数据库连接池工具包

    本资源“dbcp.rar”提供了一个完整的数据库连接池工具包,适用于那些需要频繁与数据库交互的应用程序。 数据库连接池,全称Database Connection Pool,是一种管理数据库连接的技术。它的工作原理是预先在内存中创建...

Global site tag (gtag.js) - Google Analytics