druid连接池 一段时间不用,然后在使用就会报错

进入休眠期 发布于 2015/04/29 17:08
阅读 4K+
收藏 0
这个一段时间在20分钟左右吧,粗略估计
使用的是spring3,struts2,mybatis3.2.2 连得oracle druid1.0.1
一直拿不到数据库连接,前台无响应,过一段时间会报下边的错误,然后才能正常得到连接,执行查询
系统在linux和windows上都有跑 因为是内网,错误只能给个大体的了
windows错误是
close connection error
caused by SQLRecorableException:io错误Connection reset by peer:socket write error
caused by SocketException Connection reset by peer:socket write error
linux是
close connection error
caused by SQLRecorableException:io错误 断开的管道
caused by SocketException  断开的管道
我建立了一个进程,每半分钟会用mybatis查询一下数据库,就不会有问题,但是validationQuery,testWhileIdel,TimeBetweenEvictionRunsMills都设置了,下边给出数据源配置
<property name="driverClassName" value="${jdbc.driver}" />
           
            <!-- 基本属性 url、user、password -->
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            
            <!-- 配置初始化大小、最小、最大 -->
            <property name="initialSize" value="${jdbc.pool.minIdle}" />
            <property name="minIdle" value="${jdbc.pool.minIdle}" />
            <property name="maxActive" value="${jdbc.pool.maxActive}" />           
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="60000" />      
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="30000" />
            
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="300000" />
            
            <property name="validationQuery" value="SELECT 'x' FROM DUAL" />
            <property name="testWhileIdle" value="true" />
            <property name="testOnBorrow" value="false" />
            <property name="testOnReturn" value="false" />
            
            <!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)
            <property name="poolPreparedStatements" value="true" />
            <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->

分析:
1.我设置了validationQuery感觉像是没有起作用,因为加入心跳后就正常了,
2.系统断开了一段时间没有活动的连接,这其实跟1差不多,明明设置了validationQuery的
3.oracle断开了无活动连接,但我看了一下是unlimited的,
4.查看本地端口与服务器1521端口的tcp连接,在不操作的时候,tcp连接一直有,在服务端也有,但只要使用,就会全部断开,换成新的,因为本地的端口都改变了,但是服务器上的这个端口还是established
5.在druid的监控平台查看连接数,一直显示正常,但是在用的时候会全部消失,只剩下一条,这一条应该是重新创建的

问题:
1.有办法查看validationQuery有没有起作用吗,在sql监控里边看不到这条语句~
2,oracle的unlinited我是在dba_profile中看的,不确定是在这吗
3.这问题到底是怎么出的额?大牛们,内网导个东西麻烦死,还没有换个数据源试过


加载中
0
南湖船老大
南湖船老大

    我在OSC看过之前很多人遇到过这个问题,按照其他连接池的设置,都没能解决。最后都不了了之。我没用过druid,也不知道解决方案。

    我认为这个是druid的bug.

南湖船老大
南湖船老大
问这个问题的人太多了,应该是本身的Bug
进入休眠期
进入休眠期
0.0我是接的二手的这个项目,难道要我换连接池,倒是也好换,只是问题解决不了感觉很难受~
0
进入休眠期
进入休眠期
为什么没有回答的呢0.0
0
c
chinaxuguojun
这是连接老化问题, 好解决, 应该有一个连接空闲多久, 就断开的参数设置, 你找找, dbcp, c3p0都是有的,
进入休眠期
进入休眠期
首先,非常感谢你的回答~我就是没找到为什么会连接老化的,才分好几个方面测试了,maxIdleTime什么的默认值是0的,也就是永不断开~我感觉是druid或者是系统设置的问题,但怎么也没找出是哪里出了问题
0
c
chinaxuguojun
这种问题是很常见的, 比如说, 数据库重启了, 连接池如果没有进行设置的话, 他认为池里的连接还是正常的, 取得后就会报错, 这些基本上连接池已解决了此类问题, 不过需要进行参数设置而已, 取得一个错误连接后, 再取一个正常连接类似这样子的
0
c
chinaxuguojun
老化的原因有很多, 比如 网络抖动 什么的, 会导致连接是无效的
c
chinaxuguojun
回复 @进入休眠期 : 呵呵, 我只是提供思路给你, 具体的设置你得自己去试, 各参数之间是相关的, 我使用过c3p0, dbcp都碰到过你的这种情况, 后来都是这样解决的
进入休眠期
进入休眠期
嗯,一开始我也是这么想的,都是内网机,网络抖动不知道是什么,但抖动的话tcp连接应该断开吧~,不操作之前两边的tcp连接都是有的,重启也不可能,过20分钟左右就会这样,最主要的是我设置的测试sql语句的,但好像并没有起作用
0
kaikoliang
kaikoliang

在 您好您的问题解决没有

0
kaikoliang
kaikoliang

在您这个问题解决没有

返回顶部
顶部