免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4216 | 回复: 5
打印 上一主题 下一主题

每天上午系统必然发生的一个错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-07 00:29 |只看该作者 |倒序浏览
大家新年好:
    新上的系统每天早上都发现如下的错误(mysql5.1.30+jdbc【使用的proxool连接池】+tomcat6.16):
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was49357 seconds ago.The last packet sent successfully to the server was 49357 seconds ago, which  is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

估计应该是mysql5到时间自己释放了所有的jdbc客户端程序连接,导致第二天第一个使用系统的人铁定碰到这个问题,不知道怎么配置mysql,有如下疑惑:
1、jdbc链接中已经添加了autoReconnect=true字样,字面上理解,应该是连接池到了一定时间,会自动去连接数据库。可是我在java程序中添加了貌似并没有生效。(貌似该问题更多的是 proxool这种java连接池的配置问题)
2、换一种解决思路:如何设置mysql,让mysql5永不自己杀客户端到数据库的连接(google到了wait_timeout interactive_timeout两个参数,可是不知道两个参数怎么设置让数据库永不自己杀链接)
   ---->让mysql永不杀掉客户端到自己的链接是不是一种合理的解决思路呢?是不是所有数据库都是这样做的呢?(比如oracle,难道oracle也超过了某个配置时间杀链接?)?
                                     谢谢了,祝回帖的和看帖的牛年发大财。。。。霍霍

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
2 [报告]
发表于 2009-02-10 09:43 |只看该作者
mysql默认是8小时无活动的连接会杀死。

show processlist可以看到你的sleep连接。

论坛徽章:
0
3 [报告]
发表于 2009-02-10 16:55 |只看该作者
加大你的connect_timeout吧

论坛徽章:
0
4 [报告]
发表于 2009-02-11 02:05 |只看该作者
没有数据库时使用这种机制的,oracle有这种机制?希望拜读一下

论坛徽章:
0
5 [报告]
发表于 2009-02-11 02:09 |只看该作者

回复 #4 zxsyl 的帖子

是啊,ORACLE好像也没有这种机制吧

论坛徽章:
0
6 [报告]
发表于 2009-02-16 23:28 |只看该作者

看看这里说的:

http://marc.info/?l=tomcat-user&m=121408507108483&w=2

好几个解决方法能解决你的问题。。


1,升级你的驱动程序。 connector/j 的版本够高才支持  autoconnect=true 的特性,这样就不会报错了。
   好像得升级到 5.1.6 版本。
2,弄上定期去校验connection 的机制吧。
   这个对连接池设置不太多的情况下 也不太费资源。
   应用程序数据库连接池中空闲连接,每隔一段时间去执行 一个 select 1 的查询,
   并不太费多少资源的。

3,如果你的连接池 用的是 c3p0 的话,可以考虑将 minPoolSize  设置为 0 。
   数据库连接池中空闲的连接都设置为0 。
   那么留下的连接都是在用的连接,在那个连接空闲了c3p0.maxIdleTime(hibernate.c3p0.timeout  )值后
   就自动放弃了,再来新的请求会重新再去连接数据库,自然就没有连接池中的连接 实际上 已经被MySQL 在等待了
   wait_timeout 的时间后 给你kill 掉的情况了。

  但是你如果不设置这个值的话,默认是0 ,就是一直不过期,所以 应用端的以为连接还能用,但是实际上 MySQL已经断开了这个连接,
  再用这个连接去执行 的时候,自然报以上的错误。

所以,最简单的方法就是 设置这个minPoolSize =0 并且 maxIdleTime 为一个 120 (2分钟)就能解决你的问题,
MySQL的设置不用动。

[ 本帖最后由 jb96_xlwang 于 2009-2-16 23:57 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP