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

1. 连接管理:长连接 vs 短连接

概念解析

长连接:建立连接后保持长时间活跃,适合高频请求场景

// JDBC长连接示例
Connection conn = DriverManager.getConnection(url, user, password);
// 多次复用同一个连接
Statement stmt1 = conn.createStatement();
Statement stmt2 = conn.createStatement();

短连接:每次请求后立即关闭连接,适合低频请求场景

// JDBC短连接示例
try (Connection conn = DriverManager.getConnection(url, user, password)) {
    // 单次使用后自动关闭
}

关键参数配置

图1

  • wait_timeout:非交互式连接空闲超时时间(秒)
  • interactive_timeout:交互式连接(如MySQL客户端)空闲超时时间
-- 查看当前超时设置
SHOW VARIABLES LIKE '%timeout%';

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

实践建议

  1. Web应用推荐使用长连接+连接池组合
  2. 批处理作业适合短连接模式
  3. 超时时间设置应大于连接池的idleTimeout
  4. 监控Threads_connected指标避免连接数暴涨

2. 连接池深度优化

HikariCP配置示例

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("user");
config.setPassword("password");
config.setMaximumPoolSize(20);          // 最大连接数
config.setMinimumIdle(5);              // 最小空闲连接
config.setIdleTimeout(30000);          // 空闲连接超时(ms)
config.setConnectionTimeout(10000);     // 获取连接超时(ms)
config.setMaxLifetime(1800000);         // 连接最大存活时间(ms)
config.setLeakDetectionThreshold(5000); // 泄漏检测阈值(ms)

HikariDataSource ds = new HikariDataSource(config);

Druid关键配置

# 基础配置
druid.url=jdbc:mysql://localhost:3306/mydb
druid.username=user
druid.password=password
druid.initialSize=5
druid.maxActive=20

# 监控配置
druid.filters=stat,wall
druid.webStatFilter.enabled=true
druid.statViewServlet.enabled=true

连接泄漏检测

常见泄漏场景

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

解决方案

// 1. 使用try-with-resources
try (Connection conn = dataSource.getConnection();
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    // 处理结果集
}

// 2. 添加泄漏检测(HikariCP)
config.setLeakDetectionThreshold(60000);

// 3. Druid监控面板查看活跃连接

性能优化参数对照表

参数HikariCPDruid推荐值
最大连接数maximumPoolSizemaxActive(核心数*2)+1
最小空闲连接minimumIdleminIdle同最大连接数
获取连接超时connectionTimeoutmaxWait3000-10000ms
连接最大存活时间maxLifetimemaxEvictableIdleTime30分钟
空闲连接超时idleTimeoutminEvictableIdleTime10分钟

3. 生产环境最佳实践

  1. 连接数公式
    最大连接数 = (核心数 * 2) + 磁盘数
    例如4核服务器带SSD:(4*2)+1=9
  2. 监控指标

    SHOW STATUS LIKE 'Threads_%';
    SHOW PROCESSLIST;
  3. 连接验证

    // HikariCP
    config.setConnectionTestQuery("SELECT 1");
    
    // Druid
    druid.testOnBorrow=true
    druid.validationQuery="SELECT 1"
  4. 故障排查

    • 连接数突增:检查连接泄漏或突发流量
    • 连接获取超时:调整connectionTimeout或扩容
    • 大量TIME_WAIT:优化TCP参数或启用连接复用

通过合理配置连接管理和连接池参数,可以显著提升MySQL数据库的稳定性和性能。建议结合APM工具(如SkyWalking、Prometheus)进行实时监控。

添加新评论