天天看点

MySQL莫名其妙的断开连接

原因分析

我们进入mysql的命令行查询超时时间

show variables like '%timeout%';

MySQL莫名其妙的断开连接

wait_timeout 28800单位是秒转化成小时就是8小时,看出MySQL的默认设置,当一个连接的空闲时间超过8小时后,MySQL就会断开该连接,所以发现问题出在如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源。

用命令show processlist; 可以查看Sleep状态的进程Sleep,同时可以看到每个进程Sleep多久了

MySQL莫名其妙的断开连接

解决方法

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文件

MySQL莫名其妙的断开连接

之后再重启下服务器就好了

注意:

将wait_timeout这个值设置得大了,可能会导致空闲连接过多。

如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。

继续阅读