原因分析
我们进入mysql的命令行查询超时时间
show variables like '%timeout%';
wait_timeout 28800单位是秒转化成小时就是8小时,看出MySQL的默认设置,当一个连接的空闲时间超过8小时后,MySQL就会断开该连接,所以发现问题出在如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源。
用命令show processlist; 可以查看Sleep状态的进程Sleep,同时可以看到每个进程Sleep多久了
解决方法
1.autoReconnect
这个参数表示在mysql超时断开连接后会自动重新连接
配置的话,只需要在连接mysql的语句写上autoReconnect=true
url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:6666}/d_20221222?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
这种方式它有一些副作用
具体介绍下:
- 原有连接上的事务将会被回滚,事务的提交模式将会丢失
- 原有连接持有的表的锁将会全部释放
- 原有连接关联的会话Session将会丢失,重新恢复的连接关联的将会是一个新的会话Session
- 原有连接定义的用户变量将会丢失
- 原有连接定义的预编译SQL将会丢失
- 原有连接失效,新的连接恢复后,MySQL将会使用新的记录行来存储连接中的性能数据
2.修改配置
涉及到两个配置参数interactive_timeout和wait_timeout
wait_timeout 指的是mysql在关闭一个非交互的连接之前所要等待的秒数
interactive_time 指的是mysql在关闭一个交互的连接之前所要等待的秒数
对于交互和非交互连接,说得直白一点就是,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
1.会话方式
配置方法:
set interactive_timeout=28800000;
set wait_timeout=28800000;
这种方式只对当前会话生效
2.修改配置文件方式
修改/etc/my.cnf文件
之后再重启下服务器就好了
注意:
将wait_timeout这个值设置得大了,可能会导致空闲连接过多。
如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。