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

从Connection Reset问题浅谈DBCP的使用

阅读更多
我们大家在做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,也有明显的属性选择,这里就不一一详述了,都是眼见的功夫。
分享到:
评论

相关推荐

    commons-dbcp-1.4.jar依赖包

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

    DBCP使用的包.zip

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

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

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

    使用dbcp需要用到的jar包

    在Java开发中,数据库连接管理是一项关键任务,而Apache的DBCP(Database Connection Pool)库则为开发者提供了一个高效、可配置的数据库连接池解决方案。DBCP是基于Jakarta Commons项目下的两个组件——Commons ...

    dbcp连接池使用例子

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Commons DBCP"。它在Java应用中起到了管理和复用数据库连接的作用,从而提高应用程序的性能和效率。在这个"dbcp连接池使用...

    dbcp连接池小例子

    DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为"Commons DBCP"。它在Java应用中起到了管理和复用数据库连接的作用,从而提高应用程序的性能,减少数据库资源的消耗。在Java ...

    DBCP资源池使用jar包

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

    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通过池化技术,...

    commons-dbcp-1.4.jar

    Apache Commons DBCP(Database Connection Pool)是Apache软件基金会开发的一个数据库连接池组件,主要用于Java应用程序,提供数据库连接的池化管理。标题中的"commons-dbcp-1.4.jar"是该组件的版本1.4的JAR文件,...

    dbcp连接池所使用的jar和案例

    DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,全称为"Commons DBCP"。它提供了一种有效管理数据库连接的方法,避免了频繁创建和关闭数据库连接导致的性能损耗。在Java应用程序中...

    commons中的DBCP连接池jar

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

    dbcp jar包 dbcp jar 包

    DBCP就是这样的一个连接池实现,它允许开发者预先配置一定数量的数据库连接,当应用需要时,可以从连接池中获取一个已存在的连接,使用完毕后再归还给连接池,而不是直接关闭。 DBCP主要包括两个主要的组件:...

    commons-dbcp2-2.9.0-bin.zip

    DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...

    commons-dbcp.jar.rar

    Apache Commons DBCP(Database Connection Pool)是Java世界中广泛使用的数据库连接池组件,它为应用程序提供了高效的数据库连接管理。在Java应用开发中,数据库连接池是必不可少的组件,它优化了数据库资源的分配...

    java使用dbcp所需所有包

    3. **获取和释放连接**:在需要与数据库交互时,通过`DataSource.getConnection()`方法从连接池获取一个连接,使用完毕后,必须调用`Connection.close()`方法,将连接返回给连接池,而不是关闭它。 4. **连接验证**...

    commons-dbcp jar包

    "使用说明.txt"可能包含有关如何在项目中配置和使用DBCP的详细步骤,包括但不限于: 1. 添加依赖:在Maven的pom.xml文件或Gradle的build.gradle文件中声明对DBCP的依赖。 2. 配置数据源:在Spring的配置文件中,...

    commons-dbcp-1.2.2

    2. **连接验证**:在从池中分配或归还连接时,DBCP可以执行验证操作,确保返回给应用的连接是可用的,避免了因连接失效导致的问题。 3. **池的配置**:开发者可以通过配置参数来定制连接池的行为,如最大连接数、...

    dbcp数据库连接池使用jar包

    DBCP数据库连接池的引入,使得应用程序可以预先创建并维护一定数量的数据库连接,当需要与数据库通信时,从连接池中获取一个已存在的连接,用完后不是立即关闭,而是将其归还回连接池,供后续使用。这样减少了频繁的...

Global site tag (gtag.js) - Google Analytics