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’的错误。

3. 连接池配置

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

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

主要是下面这几个配置

(1) maximum-pool-size:

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

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

参考计算公式是:

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

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

(2) minimum-idle:

最小的连接数目。

(3) max-lifetime:

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

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

(4) idle-timeout:

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

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

(0)
管理的头像管理
上一篇2025-04-16 23:43
下一篇 2025-04-16 23:44

相关推荐

  • 高防服务器的防御原理是什么,如何选择高防服务器?

    高防服务器的防御原理,简单说就是通过流量清洗、防火墙规则和黑洞路由等机制,在攻击流量到达业务服务器之前将其过滤或阻断,从而保障正常访问,流量清洗机制是核心防线高防服务器对抗DDoS攻击,靠的不是单一技术,而是一套组合动作,最常见的攻击类型是流量型攻击,比如UDP洪水、SYN洪水、ICMP放大等,核心思路是耗尽带……

    2026-07-26
    0
  • BGP线路到底是什么意思呢,有什么优势?

    BGP线路是一种通过边界网关协议实现多运营商网络互联的接入方式,能自动选择最优路径,极大提升跨网访问速度和稳定性,是解决国内南北网络瓶颈的核心方案,什么是BGP线路BGP,全称Border Gateway Protocol,边界网关协议,是互联网核心路由协议之一,它负责在自治系统之间交换网络可达性信息,BGP线……

    2026-07-26
    0
  • 增值电信业务经营许可证对IDC有多重要,如何办理?

    增值电信业务经营许可证是IDC服务商合法运营的核心凭证,它直接决定了机房能否接入骨干网、客户能否放心托管业务,以及服务商自身能否长期稳定发展,许可证是IDC进入市场的硬门槛互联网数据中心业务属于增值电信业务中的B1类,依据工信部《电信业务经营许可管理办法》,任何从事服务器托管、虚拟主机、云服务等业务的企业,必须……

    2026-07-26
    0
  • 站群服务器一个IP放几个网站合适?,怎么选

    站群服务器一个IP放3-5个网站是大多数情况下的最佳平衡点,但具体数量需根据网站权重、内容质量及IP资源成本灵活调整,这个结论基于搜索引擎对同IP站点的关联判定逻辑,以及站群运营的长期实践,如果你刚接触站群,可能会纠结于IP分配,但核心原则是:不要让搜索引擎轻易识别出这些网站属于同一实体,站群IP分配的底层逻辑……

    2026-07-26
    0
  • DDoS攻击和CC攻击有什么区别,怎么防御?

    DDoS攻击和CC攻击最核心的区别在于攻击目标不同:DDoS攻击主要消耗网络带宽和基础设施资源,而CC攻击专门针对应用层逻辑,耗尽服务器CPU和数据库连接数,两者从原理到防御手段完全不同,攻防视角下的本质差异攻击目标:一个砸门,一个撬锁DDoS攻击(分布式拒绝服务)瞄准的是网络层和传输层,通过大量伪造数据包或畸……

    2026-07-26
    0

发表回复

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