The last packet successfully received from the server was x milliseconds ago解决方案

遇到这个问题查阅很多博客,基本上大同小异,但是都于事无补。

参考文章:https://blog.csdn.net/frankcheng5143/article/details/50589264 可以移步到此查看。

网上的方案:

1.将mysql服务器的wait_timeout设置为无穷大,保证永不超时(不知道可以不,不建议采用(事实上没什么用,有文章说对5.0之前的mysql适用),像这样

set global wait_timeout=28800;

2.根据提示自动重连将autoReconnect=true添加到数据库链接的代码中,像这样

jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false

3.在mysql的wait_timeout时间之内发一次心跳,保证连接的有效性

4.在使用的时候检测连接的有效性,失效就获取一个新的连接

 

方案1和方案2基本上没用,或者说独立设置这些参数基本没用,需要结合其他参数;但是搜索到的很多博客上的文章都是围绕1,2来说,设置之后可以说一点用都没有,对重要参数idleConnectionTestPeriod只字未提。

官方建议采用第三种方式

将testConnectionOnCheckout 设为 false
将testConnectionOnCheckin 设为 true
将idleConnectionTestPeriod 设为 30,单位是秒不是毫秒,这个数字要根据项目情况设定,比8小时小就好,我设置为90

项目完整配置

jdbc.jdbcUrl = jdbc:mysql://117.*.*.*:9966/databasename?useUnicode=true&characterEncoding=utf8&autoReconnect=true
jdbc.user = root
jdbc.password = root
jdbc.miniPoolSize = 1
jdbc.maxPoolSize = 100
jdbc.initialPoolSize = 1
jdbc.maxIdleTime = 3600
jdbc.acquireIncrement = 1

jdbc.acquireRetryAttempts = 30
jdbc.acquireRetryDelay = 1000
jdbc.testConnectionOnCheckout=false
jdbc.testConnectionOnCheckin = true
jdbc.automaticTestTable = c3p0TestTable
#敲黑板,idleConnectionTestPeriod设置如果过大就会引起本文要说的问题,可以设置为10000在本地测试一下
jdbc.idleConnectionTestPeriod = 90
jdbc.checkoutTimeout=30000

 

你可能感兴趣的:(The last packet successfully received from the server was x milliseconds ago解决方案)