日期:2014-05-16  浏览次数:20426 次

DBCP连接Connection reset异常
由于网络等原因,如果数据库连接突然断开,如果没有配置重连,则会抛出Connection reset异常,现在给大家分享下我的解决办法。
spring中datasource的配置如下:
    <bean id="dispatchdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:myserver" />
    <property name="username" value="user1" />
    <property name="password" value="pwd" />
    <property name="maxActive" value="10000" />
    <property name="maxIdle" value="30" />
     <property name="minIdle" value="2" />
    <property name="maxWait" value="600000" />
    <property name="testOnBorrow" value="true"/>
    <property name="testWhileIdle" value="true"/>
    <property name="validationQuery" value="select 1 from dual"/>
</bean>


几个很重要的属性:testOnBorrow、_testOnReturn、_testWhileIdle,这些属性的意义是取得、返回对象和空闲时是否进行验证,检查对象是否有效,默认都为false即不验证。所以当使用DBCP时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了。网上很多说 DBCP的bug应该都是如此吧,只有把这些属性设为true,再提供_validationQuery语句就可以保证数据库连接始终有效了,oracle数据库可以使用SELECT COUNT(*) FROM DUAL,不过DBCP要求_validationQuery语句查询的记录集必须不为空,可能这也可以算一个小小的BUG,其实只要_validationQuery语句执行通过就可以了。