从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,也有明显的属性选择,这里就不一一详述了,都是眼见的功夫。
相关文章
相关标签/搜索