开发者社区> 问答> 正文

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

这个一段时间在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.这问题到底是怎么出的额?大牛们,内网导个东西麻烦死,还没有换个数据源试过


展开
收起
爱吃鱼的程序员 2020-06-14 16:24:19 1741 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

        我认为这个是druid的bug.

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

    在您好您的问题解决没有

    在您这个问题解决没有

    2020-06-14 16:24:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载