MySQL常见问题

以下是可能的原因和解决方案:

问题分析

连接超时或中断

日志会提示 The last packet successfully received from the server was 1,001 milliseconds ago,说明数据库服务器可能在短时间内主动关闭了空闲连接。

可能原因-服务端: MySQL 服务端的 wait_timeout 或 interactive_timeout 参数设置过短(例如默认的 8 小时),导致空闲连接被服务器关闭。 网络不稳定(如防火墙、负载均衡器、VPC 配置问题)导致连接中断。

可能原因-客户端: 连接池配置问题,配置中启用了 testWhileIdle(空闲时检查连接有效性),但 timeBetweenEvictionRunsMillis=60000(1 分钟)不足以及时检测到失效连接。 minIdle=10 但 poolingCount=0,表明连接池未能成功维护最小空闲连接,可能是数据库拒绝连接或网络问题。

解决方案

调整 MySQL 服务端配置

检查并增大以下参数:

-- 增大空闲超时时间(单位:秒)
SET GLOBAL wait_timeout = 28800;    -- 默认 8 小时
SET GLOBAL interactive_timeout = 28800;

确保服务端没有主动终止空闲连接。

优化 Druid 连接池配置

spring:
  datasource:
    druid:
      # 连接有效性检查策略
      test-on-borrow: true       # 从池中取连接时校验
      test-on-return: false      # 归还连接时校验(可选)
      validation-query: SELECT 1 # 简单的校验 SQL
      # 连接保活策略
      keep-alive: true
      min-evictable-idle-time-millis: 30000  # 最小空闲时间(30秒)
      time-between-eviction-runs-millis: 30000 # 检查间隔(30秒)

Tags: lrzsz
Share: X (Twitter) Facebook LinkedIn