`
itwangxinli
  • 浏览: 146089 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Connection Reset的解决与DHCP的使用技巧

阅读更多

说明:在解决问题的时候,参考了以下文章
http://blog.csdn.net/wuqingyong/archive/2006/09/07/1187293.aspx
http://jayenho.blog.51cto.com/37194/91556
作为对问题的总结,特写本文。


最近总是遇到tomcat的log File报Connection reset的问题,使用的是JNDI的方式来使用DataSource。
Apache Tomcat使用org.apache.naming.factory.DbcpDataSourceFactory作为默认的数据源工厂。


Tomcat的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"/>
 这样的话,就可以避免产生Connection Reset的错误了.
这样一来,就能够解决Connect Reset的问题了。刚才说了,其实很多App Server都会有相应的配置地方,只是大型的服务器正好提供了Admin Console,上面可以显式的配置Connection Pool,也有明显的属性选择,这里就不一一详述了,都是眼见的功夫。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics