最近在项目中,经常出现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
NULL 博文链接:https://redarmychen.iteye.com/blog/463864
Struts的java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决方法
struts初学者的数据池配置出现java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource异常的解决办法
Maven坐标:commons-dbcp:commons-dbcp:1.4; 标签:commons、dbcp、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和...
Maven坐标:commons-dbcp:commons-dbcp:1.4; 标签:commons、dbcp、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...
赠送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 BasicDataSource
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。 单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar 由于建立...
DBCP使用的包
COMMONS DBCP的使用与配置COMMONS DBCP的使用与配置COMMONS DBCP的使用与配置
java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
JavaEE 使用Tomcat的自带DBCP管理数据源案例
DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种
使用dbcp需要用到的jar包
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:commons-dbcp.jar,commons-pool.jar,commons-collections.jar由于建立...
DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序中使用,Tomcat的数据源使用的就是DBCP; 使用连接池的第一项工作就是导包,这里需要的两个jar包分别是: commons-dbcp-1.4....
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗...