MySQL为什么莫名其妙地断开连接以及解决方案!

前言

最近遇到在将本地的项目部署到服务器上之后遇到的一个奇怪问题。

在部署完成后,网站当时可以正常工作,但是第二天访问网站的时候却会遇到一个500 Server Error。

从日志中可以看出是MySQL数据库出现了异常:

翻译如下:

最后一个数据包在 83827560 ms 之前被成功接收,最后一个数据包在83827560 ms 之前被成功发送。比服务的配置参数wait_timeout的值要长。

日志中给出的建议如下:

翻译如下:

你应考虑在程序中进行数据库操作之前检验数据库连接的有效性或者将数据库的autoReconnect属性设置为true来避免这个问题。

关于wait_timeout和autoReconnect下面我们会依次分析介绍!

原因分析

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

28800单位是秒转化成小时就是8小时。

看出MySQL的默认设置,当一个连接的空闲时间超过8小时后,MySQL就会断开该连接。

所以发现问题出在如果超过这个wait_timeout时间(默认是8小时)对数据库没有任何操作,那么MySQL会自动关闭数据库连接以节省资源。

数据库连接自动断开的问题确实是在第二天发生了,也就是在一个晚上没有对数据库进行操作(显然超过了8小时)的情况下发生的这个问题。

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

下面介绍下解决和优化办法!

解决方法

1、autoReconnect

这个参数表示在mysql超时断开连接后会自动重新连接。

配置的话,只需要在连接mysql的语句写上autoReconnect=true。

jdbc:mysql://127.0.0.1:3306/stock_tweet?autoReconnect=true

下面是MySQL官网对autoReconnect的解释:

同时可以看到官网不推荐使用这个参数,因为它有一些副作用。

具体介绍下:

  • 原有连接上的事务将会被回滚,事务的提交模式将会丢失。
  • 原有连接持有的表的锁将会全部释放。
  • 原有连接关联的会话Session将会丢失,重新恢复的连接关联的将会是一个新的会话Session。
  • 原有连接定义的用户变量将会丢失。
  • 原有连接定义的预编译SQL将会丢失。
  • 原有连接失效,新的连接恢复后,MySQL将会使用新的记录行来存储连接中的性能数据。

2、修改配置

涉及到两个配置参数interactive_timeout和wait_timeout。

wait_timeout 指的是mysql在关闭一个非交互的连接之前所要等待的秒数。

interactive_time 指的是mysql在关闭一个交互的连接之前所要等待的秒数。

对于交互和非交互连接,说得直白一点就是,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。

配置方法:

1.会话方式

msyql> setglobalwait_timeout=2880000;
msyql> setglobalinteractive_timeout=2880000;

这种方式只对当前会话生效。

2.修改配置文件方式

修改/etc/my.cnf文件,在 [mysqld] 节中设置:

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

注意:

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

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

连接池配置

因为连接池的配置也会影响项目和MySQL的连接,所以也需要对数据库连接池的一些配置做一定修改。

我们以Spring Boot 2.0默认的数据库连接池HikariCP为例。

主要是下面这几个配置

maximum-pool-size:

最大连接数,超过这个数,新的数据库访问线程会被阻,缺省值:10。

常见的错误是设置一个太大的值,连接数多反而性能下降。

参考计算公式是:

#core_countCPU个数,effective_spindle_count:硬盘个数
connections = ((core_count * 2) + effective_spindle_count)

例如:一个4核,1块硬盘的服务器,连接数 = (4 * 2) + 1 = 9,凑个整数,10就可以了。

minimum-idle:

最小的连接数目。

max-lifetime:

最大的连接时间,用来设置一个connection在连接池中的存活时间。

缺省:30分钟。强烈建议设置比数据库超时时长少一点(MySQL的wait_timeout参数一般为8小时)。

idle-timeout:

一个连接idle状态的最长时间,超时则被释放。

其他参数详见:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/302181.html<

(0)
管理的头像管理
上一篇2025-05-24 16:31
下一篇 2025-05-24 16:33

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注