`

转帖:从Connection Reset问题浅谈DBCP的使用技巧

 
阅读更多
最近在项目中,经常出现Connection Reset错误,使用下文方法解决:
----------------------------------------------------------
我们大家在做J2EE项目开发的时候,都会用到Application Server,然后配置Connection Pool,Data Source,但不知道大家有没有留意到,其实我们绝大部分的应用用的都是Apache的DBCP机制。
 
JES,Weblogic,JBoss等等的大型App Server,其中一个好处就是提供了Admin Console,让配置做起来就像傻瓜式的,Step By Step就可以了,下面举个用Tomcat的应用例子,深入一点探讨DBCP的配置都做了些什么。(当然得配置Server.xml了,但是其实JES和Weblogic等等的大型App Server,也是可以同样修改Server.xml或这Domain.xml来达到同一目的的,只不过有了Admin Console,大家容易避免犯错,但其实我觉得,要深入了解一个App Server,避免不了深入了解配置文件里面的内容)。
 
当使用DBCP(通常我们都是用Oracle的了)时候,不知道大家有没有遇到一个情况,当数据库连接因为某种原因断掉(有可能时网络问题,导致App Server跑了一天后,第二天再跑马上爆错误),再从Connection Pool中获取连接而又不做Validate,这时候取得的Connection实际上已经是无效的了,从而导致程序一跑,马上爆Connect Reset错误。
 
其实只要你了解一下DBCP的运作机制和相关属性的话,这个问题就很容易避免了。
 
DBCP使用Apache的ObjectPool作为Connection Pool的实现,在构造GenericObjectPool的时候,会生成一个Inner Class Evictor,实现Runnable的接口。如果属性_timeBetweenEvictionRunsMillis > 0,每过_timeBetweenEvictionRunsMillis毫秒后Evictor会调用evict method,检查Object的idle time是否大于属性_minEvictableIdleTimeMillis毫秒(如果_minEvictableIdleTimeMillis设置为<=0则忽略,使用default value 30分钟),如果是则销毁该Object,否则就激活并进行Validate,然后调用ensureMinIdle method检查确保Connection Pool中的Object个数不小于属性_minIdle。在调用returnObject method把Object放回ObjectPool时候,需要检查该Object是否有效,然后调用PoolableObjectFactory的passivateObject method使Object处于inactive状态,再检查ObjectPool中的对象个数是否小于属性_maxIdle,是则可以把该Object放回到ObjectPool,否则销毁此Object。
 
除此之外,还有几个比较重要的属性,_testOnBorrow,_testOnReturn,_testWhileIdle,这些属性的意思是取得,返回对象,空闲时候是否进行Valiadte,检查对象是否有效。默认都为False,只有把这些属性设为True,再提供_validationQuery语句就可以保证DBCP始终有效了,例如,Oracle中就完全可以使用select 1 from dual来进行验证,这里要注意的是,DBCP要求_validationQuery语句查询的Result Set必须为非空。
 
在Tomcat的Server.xml,我们可以看看下面的这个例子:
 
<Resource name="lda/raw"
              type="javax.sql.DataSource"
               password="lda_master"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               maxIdle="30" minIdle="2" maxWait="60000" maxActive="1000"
               testOnBorrow="true" testWhileIdle="true" validationQuery="select 1 from dual"
               username="lda_master" url="jdbc:oracle:thin:@192.160.100.107:15537:lcststd"/>
 
这样一来,就能够解决Connect Reset的问题了。刚才说了,其实很多App Server都会有相应的配置地方,只是大型的服务器正好提供了Admin Console,上面可以显式的配置Connection Pool,也有明显的属性选择,这里就不一一详述了,都是眼见的功夫。
分享到:
评论

相关推荐

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    implementation 'commons-dbcp:commons-dbcp:1.2.1' implementation 'commons-collections:commons-collections:3.2.1' implementation 'commons-pool:commons-pool:1.6' // 或者对应版本 } ``` 执行`./...

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource

    Apache Commons DBCP(Database Connection Pool)是一个开源的、基于Apache Commons项目的数据源池组件。它提供了一个实现JDBC(Java Database Connectivity)规范的连接池,可以显著提高数据库操作的性能,因为...

    Struts的java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决方法

    2. **版本不匹配**:如果你正在使用的Struts或其他依赖库需要特定版本的DBCP,而你提供的是不同版本的JAR,也可能导致此问题。检查你的项目依赖,确保所有组件的版本兼容。 3. **类加载器问题**:如果应用服务器有...

    NotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决方法

    implementation 'commons-dbcp:commons-dbcp:1.4' ``` 运行`mvn install`或`gradle build`,构建工具会自动下载并管理依赖。 3. **配置类加载器**:在某些情况下,可能需要配置应用服务器(如Tomcat、Jetty等)...

    commons-dbcp-1.4-API文档-中英对照版.zip

    Maven坐标:commons-dbcp:commons-dbcp:1.4; 标签:commons、dbcp、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...

    commons-dbcp-1.4-API文档-中文版.zip

    Maven坐标:commons-dbcp:commons-dbcp:1.4; 标签:commons、dbcp、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    commons-dbcp-1.4.jar依赖包

    7. **最佳实践**:提供在实际项目中使用DBCP的最佳实践,包括如何处理并发问题,以及在不同场景下选择合适的连接池配置。 8. **版本更新与迁移**:提及DBCP 1.4版的历史背景,以及可能存在的已知问题,如果有的话,...

    commons-dbcp包资源

    Apache Commons DBCP(Database Connection Pool)是Apache软件基金会开发的一个开源项目,它提供了一个数据库连接池组件。数据库连接池在处理多用户并发访问时,能够有效地管理数据库连接,提高系统的性能和效率。...

    commons中的DBCP连接池jar

    Apache Commons DBCP(Database Connection Pool)是Java开发中常用的一个数据库连接池组件,它属于Apache Commons项目的一部分。DBCP提供了数据库连接池的功能,能够有效地管理和复用数据库连接,提高应用性能并...

    JavaEE 使用Tomcat的自带DBCP管理数据源案例

    DBCP通过维护一个数据库连接的池,当应用程序需要连接时,可以从池中获取一个已建立的连接,使用完毕后归还回池而不是关闭连接。这样可以避免频繁地打开和关闭连接,降低系统开销,并且能更好地支持多线程环境。 ...

    DBCP依赖Jar包

    DBCP(Database Connection Pool)是Apache软件基金会的一个开源项目,全称为"Commons DBCP",它提供了一个数据库连接池服务。数据库连接池在应用服务器启动时建立一定数量的数据库连接,然后在应用程序需要时分配给...

    COMMONS DBCP的使用与配置

    Apache Commons DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,它提供了在Java应用程序中管理和复用数据库连接的能力。DBCP的主要作用是提高应用性能,通过池化技术减少创建和...

    DBCP三个使用jar包

    DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,用于管理数据库连接,提高应用程序的性能和效率。在Java开发中,数据库连接的创建和关闭是相对耗时的操作,而DBCP通过池化技术,...

    dbcp的jar包

    DBCP,全称为Apache Commons DBCP,是Apache软件基金会提供的一个开源数据库连接池组件。在Java应用程序中,DBCP扮演着重要的角色,它能够有效地管理和优化数据库连接,提高系统的性能和资源利用率。 数据库连接池...

    commons-dbcp2-2.2.0-API文档-中文版.zip

    赠送jar包:commons-dbcp2-2.2.0.jar; 赠送原API文档:commons-dbcp2-2.2.0-javadoc.jar; 赠送源代码:commons-dbcp2-2.2.0-sources.jar; 赠送Maven依赖信息文件:commons-dbcp2-2.2.0.pom; 包含翻译后的API文档...

    DBCP使用的包.zip

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Commons DBCP",它是基于JDBC(Java Database Connectivity)的一个数据库连接池实现。DBCP主要用于管理和复用数据库连接,...

    jdbc与dbcp数据库连接

    3. **创建Statement对象**:使用Connection对象创建Statement或PreparedStatement对象来执行SQL语句。 4. **执行SQL**:通过Statement对象执行SQL查询或更新操作。 5. **处理结果**:获取并处理ResultSet对象,获取...

    java使用dbcp所需所有包

    Java使用DBCP(Jakarta Commons DBCP)作为数据库连接池是常见的做法,尤其是在早期的Java应用程序中。DBCP是Apache软件基金会的一个项目,它提供了一个实现JDBC规范的连接池组件,允许开发者高效地管理和复用数据库...

    dbcp BasicDataSource

    官网下载的dbcp BasicDataSource

Global site tag (gtag.js) - Google Analytics