`

DBCP数据库连接失效的解决方法(Io 异常:Connection reset)

阅读更多
网上很多评论说DBCP有很多BUG,但是都没有指明是什么BUG,只有一部分人说数据库如果因为某种原因断掉后再DBCP取道的连接都是失效的连接,而没有重新取。有的时候会报Io 异常:Connection reset。
解决方法:
spring中datasource的配置如下:
    <bean id="dispatchdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:myserver" />
    <property name="username" value="user1" />
    <property name="password" value="pwd" />
    <property name="maxActive" value="10000" />
    <property name="maxIdle" value="30" />
     <property name="minIdle" value="2" />
    <property name="maxWait" value="600000" />
    <property name="testOnBorrow" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="validationQuery" value="select 1 from dual"/>
</bean>
分析:
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数据库连接池

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

    DBCP数据库连接池

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

    dbcp数据库连接池使用jar包

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

    jdbc与dbcp数据库连接

    2. **建立连接**:通过`DriverManager.getConnection()`方法建立到数据库的连接。 3. **创建Statement对象**:使用Connection对象创建Statement或PreparedStatement对象来执行SQL语句。 4. **执行SQL**:通过...

    dbcp数据库连接池jar包

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

    DBCP数据库连接池jar包.zip

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

    DBCP配置数据库连接池

    4. **获取与释放连接**: 使用数据源的`getConnection()`方法获取数据库连接,使用完毕后调用`close()`方法返回到连接池,而不是关闭连接: ```java Connection conn = dataSource.getConnection(); // 执行SQL...

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

    Apache Commons DBCP是Apache软件基金会的一个子项目,提供了一个实现了Java.sql.Connection接口的池化对象,使得应用程序能够高效地重复使用数据库连接,而无需频繁地创建和关闭连接。这样可以显著降低与数据库交互...

    DBCP数据库连接池包下载

    DBCP(Database Connection Pool)是Apache软件基金会的一个开源项目,全称为Apache Commons DBCP,它是一个基于Java的数据库连接池实现。在Java应用程序中,DBCP被广泛用于管理数据库连接,以提高性能和资源利用率...

    Apache-DBCP数据库连接池

    Apache DBCP(Database Connection Pool)是Apache软件基金会下的一个开源项目,主要提供数据库连接池服务。数据库连接池在Java应用程序中扮演着重要的角色,它能够有效地管理数据库连接,提高应用性能并降低资源...

    DBCP数据库连接池jar包

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

    DBCP数据库连接池借鉴.pdf

    数据库连接池(Database Connection Pool)是一种管理数据库连接的机制,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要时都创建新的连接。这样可以显著提高性能,减少系统资源的消耗,尤其是在高并发...

    DBCP数据库连接池[参照].pdf

    DBCP(Database Connection Pool)是Apache的一个开源项目,它提供了一个数据库连接池组件,用于管理数据库连接,以提高数据库访问效率。数据库连接池在初始化时会创建一定数量的数据库连接,并将其保存在一个池中,...

    java配置dbcp数据库连接池架包

    Java DBCP(Database Connection Pool)数据库连接池是Apache Commons的一个组件,用于管理数据库连接,提高应用程序的性能和效率。数据库连接池在初始化时会创建一定数量的数据库连接,并将这些连接保存在一个池中...

    DBCP数据库连接池1.2jar包

    DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar由于建立...

    DBCP数据库连接池.pdf

    DBCP(Database Connection Pool)是Apache的一个开源项目Commons DBCP,它提供了一个数据库连接池的实现。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在应用程序中可以被复用,从而避免了频繁创建...

    DBCP 数据库连接池JNDI连接 学习笔记

    数据库连接池(Database Connection Pool,简称 DBCP)是一种在多用户并发访问数据库时提高数据库系统性能的技术。它通过预创建并管理一定数量的数据库连接,避免了每次连接数据库时的初始化开销,同时也能有效地...

    DBCP 数据库连接池

    NULL 博文链接:https://xiongjiajia.iteye.com/blog/1295094

Global site tag (gtag.js) - Google Analytics