mysql8小时未连接自动断开 Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communicat


报错:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 52,517,522 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.

情景: 昨天部署的一个安卓app的接口 早上来看测试时候服务关掉了 报了s如上的

MySQL8小时问题,Mysql服务器默认连接的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。
但是DBCP连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。

解决方案 :

  1. 在mysql修改等待事件

  2. 在连接池修改
    下面就是DBCP连接池,同时使用了以上两个方案的配置配置
    validationQuery = “SELECT 1” 验证连接是否可用,使用的SQL语句
    testWhileIdle = “true” 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
    testOnBorrow = “false” 借出连接时不要测试,否则很影响性能
    timeBetweenEvictionRunsMillis = “30000” 每30秒运行一次空闲连接回收器
    minEvictableIdleTimeMillis = “1800000” 池中的连接空闲30分钟后被回收,默认值就是30分钟。
    numTestsPerEvictionRun=“3” 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3.

    解释:
    配置timeBetweenEvictionRunsMillis = “30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。
    testWhileIdle = “true” 表示每30秒,取出3条连接,使用validationQuery = “SELECT 1” 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。
    testOnBorrow = “false” 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = “SELECT 1” 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false.
    每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出"SELECT 1” SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值