数据库连接池连接失效,报错the last package......,wait_timeout默认8小时

提示这是我的个人IT资源网站,大家可以进去看看

这段时间遇到一个问题,程序报错the last package…
这个问题本质上是数据库连接池的问题,如果再往深里讲是TCP连接失效导致连接不可用。这里需要了解下面几个名词的含义,首先是连接池,连接池里维护一组jdbc连接,这些连接在系统运行某个时间可能有一些连接被线程使用,也有一些连接处于空闲状态,这里当然也存在状态转换,空闲的连接会转换为被占用状态,被占用状态也会转换为空闲状态。其中被占用状态转换为空闲状态需要钝化,也就是初始化,同时钝化也会检查连接的状态是否还可以使用,如果发现连接异常就把连接销毁。jdbc连接本质就是TCP连接,这个连接什么时间会断掉,这是个概率问题,但是大致上我们知道如果mysql认为该连接长时间未使用服务器会主动断掉连接,如果使用proxy,它也会根据策略关闭连接。但是需要注意的是TCP连接是双向工作,单方面关闭连接不会导致TCP连接关闭,也就是说服务器关闭了连接但是TCP连接还在,这种就很麻烦了,这样导致连接池中维护的连接会存在不健康的连接,也就是连接虽然还在但是已经不能用了。这时候我们从连接池中取出一个不健康的连接发请求是没问题的,但是一旦客户端调用read方法想读服务器返回数据就会抛出异常。这就是你上面返回一坨异常的根本原因,连接的失效时间是由mysql的两个参数wait_timeout(非交互式连接失效时间)和interactive_timeout(交互式连接失效时间)决定的,默认是8小时也就是28800秒。
解决方法
1.修改mysql的my.cnf文件,在mysqld下面加上wait_timeout和interactive_timeout,增大其失效时长,但是这种做法也只是延长了报错的出现的时间,并没从根本上解决问题。
2.在程序中去处理,数据库连接池一般会有相关设置,例如我使用的c3p0数据池,通过设置idleConnectionTestPeriod的值来定期检查连接池中的连接,可以设置成60s检查一次,其他的连接池应该也有相关设置,大家可以针对性去查找并设置。
在这里插入图片描述
这是我觉得不错的学习网站之一,里面还是比较全面的,如果大家都能学完,保证可以找到一个不错的工作,点击进去看看吧!

猜你喜欢

转载自blog.csdn.net/weixin_45345374/article/details/109115024
今日推荐