MySQL服务器所支持的最大链接数是有上限的,由于每一个链接的创建都会消耗内存,所以咱们但愿客户端在链接到MySQL Server处理完相应的操做后,应该断开链接并释放占用的内存。若是你的MySQL Server有大量的闲置链接,他们不只会白白消耗内存,并且若是链接一直在累加而不断开,最终确定会达到MySQL Server的链接上限数,这会报'too many connections'的错误。因此mysql在必定时长后默认断开链接而且释放掉sleep的链接线程,已保证mysql server不会出现链接数过满的状况。而tomcat内置/c3p0/dbcp链接池则觉得该链接依然有效,这种状况下,如何客户端代码向链接池获取链接,链接池就会把失效的链接返回给客户端代码,客户端代码在使用该失效的链接后就会抛出上面的异常。html
mysql默认8小时数据库断开的设置参数以下:mysql
1)interactive_timeout:
参数含义:服务器关闭交互式链接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)spring
(2)wait_timeout:
参数含义:服务器关闭非交互链接以前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的链接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)sql
ps:若是在配置文件my.cnf中只设置参数wait_timeout=100,则重启服务器后进入,执行:Mysql> show variables like “%timeout%”;会发现参数设置并未生效,仍然为28800(即默认的8个小时)。查询资料后,要同时设置interactive_timeout和wait_timeout才会生效。数据库
复现此问题很容易:设置端口链接为60s便可,而后等待2分钟后在调一样的接口并会出现。tomcat
解决思路:springboot
1.既然链接8小时会断开链接,能够设置更长一些好比24小时?不推荐,须要修改mysql自身的配置服务器
2.在数据库链接的URL后面加上autoReconnect=true,听说是mysql版本5.1以前有效测试
3.修改数据源的链接池参数,springboot的修改参数以下url
spring.datasource.mysql.max-idle: '10' spring.datasource.mysql.max-wait: '10000' spring.datasource.mysql.min-idle: '5' spring.datasource.mysql.initial-size: '5'
#mysql的此时链接语句 spring.datasource.mysql.validation-query: SELECT 1
#当从链接池借用链接时,是否测试该链接 spring.datasource.mysql.test-on-borrow: 'false'
#当链接空闲时,是否执行链接测试 spring.datasource.mysql.test-while-idle: 'true'
#指定空闲链接检查、废弃链接清理、空闲链接池大小调整之间的操做时间间隔 spring.datasource.mysql.time-between-eviction-runs-millis: '18800'
https://blog.csdn.net/zhanxiaoyun1/article/details/79654668
详细的参数配置以下