MySQL连接管理与连接池优化实战指南

1. 连接管理

长连接 vs 短连接

长连接:建立连接后持续保持,多个SQL操作复用同一个连接。适合高并发短事务场景。

// JDBC长连接示例
Connection conn = DriverManager.getConnection(url, user, password);
// 执行多个SQL
conn.close(); // 最后统一关闭

短连接:每次SQL操作后立即关闭连接。适合低频长事务场景。

// JDBC短连接示例
for (int i = 0; i < 100; i++) {
    Connection conn = DriverManager.getConnection(url, user, password);
    // 执行SQL
    conn.close(); // 每次用完关闭
}

实践建议

  • Web应用推荐使用长连接+连接池
  • 批处理作业可考虑短连接
  • 注意长连接可能导致服务端连接数耗尽

连接超时参数

MySQL有两个关键超时参数:

SHOW VARIABLES LIKE '%timeout%';
参数默认值说明
wait_timeout28800秒(8小时)非交互式连接空闲超时
interactive_timeout28800秒交互式连接(如mysql客户端)空闲超时

优化建议

-- 生产环境推荐设置(根据业务调整)
SET GLOBAL wait_timeout = 600;  -- 10分钟
SET GLOBAL interactive_timeout = 1800; -- 30分钟

2. 连接池优化

常见连接池配置

HikariCP (Spring Boot默认)

# application.yml配置示例
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 600000  # 10分钟
      max-lifetime: 1800000 # 30分钟
      connection-timeout: 30000
      leak-detection-threshold: 5000 # 5秒

Druid (阿里开源)

// Java配置示例
DruidDataSource ds = new DruidDataSource();
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setMaxActive(20);
ds.setMinIdle(5);
ds.setMaxWait(60000);
ds.setTimeBetweenEvictionRunsMillis(60000); // 60秒检测一次
ds.setMinEvictableIdleTimeMillis(300000); // 5分钟

连接池参数对比

图1

实践建议

  • 连接数 = (核心数 * 2) + 有效磁盘数 (适用于CPU密集型)
  • 监控连接池指标:活跃连接、空闲连接、等待线程数
  • 不同微服务使用独立连接池

连接泄漏检测与预防

常见泄漏场景

  1. 未关闭Connection/Statement/ResultSet
  2. 事务未提交或回滚
  3. 异常处理中遗漏资源释放

检测方法

// HikariCP泄漏检测日志示例
WARN  com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered

预防措施

  1. 使用try-with-resources语法:

    try (Connection conn = dataSource.getConnection();
      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery(sql)) {
     // 处理结果
    }
  2. Spring事务管理:

    @Transactional
    public void updateData() {
     // 业务代码
    }
  3. 监控工具配置:

    -- 查看当前连接状态
    SHOW PROCESSLIST;

实践建议

  • 开发环境设置较短的leakDetectionThreshold(如5秒)
  • 生产环境定期检查连接数异常增长
  • 使用APM工具(如SkyWalking)监控连接生命周期

总结对比表

特性长连接短连接连接池
创建开销极高
内存占用
并发能力
适用场景低频长事务简单脚本高并发Web应用
管理难度

通过合理配置连接管理和连接池参数,可以显著提升MySQL数据库的并发处理能力和稳定性。建议根据实际业务场景进行压力测试,找到最佳配置参数。

添加新评论