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

发布于 2021-12-03 10:00:05 字数 4324 浏览 859 评论 11

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

柳絮泡泡 2021-12-08 18:33:51

在您这个问题解决没有

南冥有猫 2021-12-08 18:30:49

在 您好您的问题解决没有

少女情怀诗 2021-12-08 18:30:23

嗯,一开始我也是这么想的,都是内网机,网络抖动不知道是什么,但抖动的话tcp连接应该断开吧~,不操作之前两边的tcp连接都是有的,重启也不可能,过20分钟左右就会这样,最主要的是我设置的测试sql语句的,但好像并没有起作用

你曾走过我的故事 2021-12-08 18:26:54

回复
呵呵, 我只是提供思路给你, 具体的设置你得自己去试, 各参数之间是相关的, 我使用过c3p0, dbcp都碰到过你的这种情况, 后来都是这样解决的

一笔一画续写前缘 2021-12-08 18:18:48

老化的原因有很多, 比如 网络抖动 什么的, 会导致连接是无效的

爱的故事 2021-12-08 18:13:15

这种问题是很常见的, 比如说, 数据库重启了, 连接池如果没有进行设置的话, 他认为池里的连接还是正常的, 取得后就会报错, 这些基本上连接池已解决了此类问题, 不过需要进行参数设置而已, 取得一个错误连接后, 再取一个正常连接类似这样子的

眼眸里的那抹悲凉 2021-12-08 16:34:41

首先,非常感谢你的回答~我就是没找到为什么会连接老化的,才分好几个方面测试了,maxIdleTime什么的默认值是0的,也就是永不断开~我感觉是druid或者是系统设置的问题,但怎么也没找出是哪里出了问题

高跟鞋的旋律 2021-12-08 03:52:15

这是连接老化问题, 好解决, 应该有一个连接空闲多久, 就断开的参数设置, 你找找, dbcp, c3p0都是有的,

顾挽 2021-12-07 22:56:45

为什么没有回答的呢0.0

可是我不能没有你 2021-12-07 22:26:09

0.0我是接的二手的这个项目,难道要我换连接池,倒是也好换,只是问题解决不了感觉很难受~

甜柠檬 2021-12-05 07:14:56

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

    我认为这个是druid的bug.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文