设为首页 收藏本站
查看: 368|回复: 0

[经验分享] 数据库连接池碰到mysql的wait_timeout出现连接异常的解决问题

[复制链接]

尚未签到

发表于 2016-10-19 05:04:09 | 显示全部楼层 |阅读模式
项目最近老是在重启8小时候过后查询出错。check log,发现是mysql数据库默认wait_time时间是8小时。8小时候过后,datasource-pool中的所有连接被mysql-server端释放掉。客户端并不知道,程序直接从datasource-pool中获取连接,并没有检测连接有效性,使用的时候就出错了。
    于是就趁此机会,花了两天时间仔细学习了mysql的相关设置和dbcp和c3p0。
由于要测试,肯定不能用mysql默认的8小时来测试了。等的头发都白了,还不能重现。果断重设wait_time时间。mysql 上有段原话
The number of seconds the server waits for activity on a noninteractive connection before closing it. This timeout applies only to  TCP/IP and Unix socket file connections, not to connections made using named pipes, or shared memory.
这个数值只对tcp/ip和unix socket 连接有效,对命名管道,和共享内存无效。 mysql的驱动建立的连接是tcp/ip连接吧,果断继续。
然后官网上又说wait_timeout的初始值是从全局wait_timeout和 interactive_timeout.初始化来的。

    果断设置全局wait_timeout。 狂百度,大家都说在my.cnf中设置,重启。好吧,my.cnf中设置好,重启mysql。show variables like '%timeout',成功了,但是测试发现没起作用。怎么一回事?百度,就那点货了,找不到。然后还是google。 原来是my.cnf设置的也是session级别的。对mysql驱动建立的连接没起作用,这里我也不明白为什么没起作用,有人知道,可以知会一声,难道mysql驱动建立的连接不是session级别么。 show gloable variables like '%timeout%'。还是默认值。也就是my.cnf设置这种方式是不成功的,直接set globle wait_timeout=10.--Query OK, 0 rows affected (0.00 sec。 怎么回事,没成功?再次show一下。原来已经成功了。 再次测试验证,wait_timeout已经设置成功。

   这里为了解决问题,其实我是知道建立测试query和测试表是可以实现的。但是后来又听说连接属性设置autoReconnect=true也可以。设置过后,就像其他人一样,java的mysql驱动是不行的。autoReconnect 和autoReconnectForPool 都不行,四处查询了下。这个参数不适用java的mysql驱动。罢了,还是老老实实的设置validatequery吧。

这里项目中都引入了dbcpjar包和c3p0jar包,配置哪一种数据库连接池都可以。

   dbcp: 必须设置validateQuery testOnBorrow也要设置为true。testWhileIdle设置为true也行。再次测试,其实就设置了个validateQuery也行。其他参数不要。
只是这样实际的pool中不会维持最小数量idle的连接。每次获得新的连接的时候验证连接有效性,都失效了了话,重新建立一个。

   c3p0:通过idleConnectionTestPeriod和maxIdleTime 这两个参数的配置,具体就是必须小于mysq server端的wait_time时间设置,可以不用validateQuery testTable等复杂设置就解决mysql的wait_time超时的问题。

而且本人不钟爱异步程序。 c3p0不需要额外的validatquery。 不需要额外的表,保持了数据库的干净。 所以就用c3p0

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-288016-1-1.html 上篇帖子: MySQL将一个数据库中的表移到另一个数据库中 下篇帖子: MySQL中更新与子查询条件中同一个表中的字段数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表