关于Linux连接Oracle数据库报错Caused by: java.sql.SQLRecoverableException: IO Error: Connection timed out的解决方案

       最近做项目碰到一个很奇怪的现象,项目在本机运行一切正常,放到LInux服务器上查询数据库的时候就报错Caused by: java.sql.SQLRecoverableException: IO Error: Connection timed out。

      

错误具体描述为,查询一直卡在那里,到了配置的最大的连接时间之后就报超时。

本人通过网上找了些资料,网上的描述为:数据库连接池内的连接在长时间不是用的情况下会失效,而这个时候客户端(也就是我们的程序)并不知道这个连接已经失效,在连接数据库的时候依然会使用这个连接,所以会报错。解决方案为在配置文件里面加上validationQuery=“select 1 from dual”(数据库不同语句也不同,具体参考http://blog.sina.com.cn/s/blog_72ef7bea0101hpj8.html),这样客户端在使用数据库查询的时候会先发这个查询去效验这个连接是否是正常连接,若无效则使用新的连接。

结论:本人使用上面的解决方案之后发现并没有什么卵用。

最终解决:使用了阿里巴巴提供的一个架包,理由是跟上面的一样,查询之前会先去效验这个连接是否正常。下面是配置,要使用的朋友把用户名密码什么的配置下就行了。这个会用到一个架包,下载地址:http://pan.baidu.com/s/1jHeZPpO。

<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"/>
    <bean id="slf4j-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"/>
	 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"  destroy-method="close" init-method="init" lazy-init="true">
        <property name="url" value="${jpreTest.url}"/>
        <property name="username" value="${jpreTest.username}"/>
        <property name="password" value="${jpreTest.password}"/>
        <property name="maxActive" value="${jpreTest.maxActive}"/>
        <property name="driverClassName" value="${jpreTest.connection.driver_class}" />
        <property name="maxWait" value="${jpreTest.maxWait}"/>
        <property name="removeAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="60"/>
        <property name="logAbandoned" value="true"/>
        <property name="initialSize" value="1" />
        <property name="maxIdle" value="${jpreTest.maxIdle}"></property>
        <property name="proxyFilters">
            <list>
                <ref bean="stat-filter"/>
                <ref bean="slf4j-filter"/>
            </list>
        </property>
        <property name="validationQuery" value="select * from dual"/>
    </bean>	
注意失效:架构有风险,换包须谨慎。。。。。

你可能感兴趣的:(java,数据库,Connection,超时,out,timed)