上云后mysql默认wait_timeout导致应用层很多连接不可用

上云后mysql默认wait_timeout导致应用层很多连接不可用

  • [1. 现象](#1. 现象)
  • [2. 原因](#2. 原因)
    • [为什么云服务器(阿里云、腾讯云)通常更需要把 timeout 设小?](#为什么云服务器(阿里云、腾讯云)通常更需要把 timeout 设小?)
      • [因此,如果你把 wait_timeout 设置很大,会发生什么?](#因此,如果你把 wait_timeout 设置很大,会发生什么?)
  • [3. 解决](#3. 解决)
    • [3.1 mysql服务器修改wait_timeout](#3.1 mysql服务器修改wait_timeout)
    • [3.2 业务系统连接池的配置修改](#3.2 业务系统连接池的配置修改)

1. 现象

系统部署在阿里云服务器中,mysql正常部署,但业务系统经常报错,几种报错的内容如下

①. Connection com.mysql.cj.jdbc.ConnectionImpl@45ed27d2 marked as broken because of SQLSTATE(08S01), ErrorCode(1160)

②. Could not roll back JDBC transaction: nested exception is java.sql.SQLException: Connection is closed

③. Could not open JDBC Connection for transaction; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

2. 原因

为什么云服务器(阿里云、腾讯云)通常更需要把 timeout 设小?

在云环境中,网络设备会主动清理"长时间不活跃的 TCP 连接",包括:

• 云防火墙

• SLB(负载均衡)

• VPC 虚拟网络

• 安全组防火墙

• NAT 网关

• TCP keepalive 机制

这些设备都会 "默默" 关闭长时间不活跃的连接。

因此,如果你把 wait_timeout 设置很大,会发生什么?

应用层以为连接还在

但底层网络已经把 TCP 连接关闭

下一次用这个连接时就会抛异常:

Communications link failure

mysql默认的wait_timeout: 28800 单位秒,8小时。
这在平时开发测试环境是没有问题的;但上云后会出现这样的问题;

3. 解决

3.1 mysql服务器修改wait_timeout

复制代码
# 设置非交互连接的超时时间
wait_timeout = 900          # 15 分钟
interactive_timeout = 900   # 15 分钟

重启mysql
systemctl restart mysql

验证生效
SHOW VARIABLES LIKE 'wait_timeout';

3.2 业务系统连接池的配置修改

这里以HikariCP为例。

spring: 复制代码
  datasource:
    hikari:
      # 连接池中允许的最大连接数 (默认: 10)
      maximum-pool-size: 20      
      # 连接池中保持的最小空闲连接数 (建议与maximum-pool-size相同)
      minimum-idle: 2      
      # 连接超时时间 (毫秒) (默认: 30000)
      connection-timeout: 30000      
      # 连接最大存活时间 (毫秒) (建议比数据库wait_timeout小2-3分钟)
      max-lifetime: 840000  # 15分钟      
      # 连接空闲超时时间 (毫秒) (默认: 600000)
      idle-timeout: 600000  # 10分钟      
      # 连接测试查询 (部分数据库需要)
      connection-test-query: SELECT 1

核心就是max-lifetime < mysql中的wait_timeout

相关推荐
草莓熊Lotso4 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠6 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_12 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
九皇叔叔13 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
橙子家13 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_9620664915 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext16 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界17 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统
何以解忧,唯有..18 小时前
Pydantic 介绍与使用:Python 数据校验的现代方案
数据库·python·microsoft
超兔一体云19 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql