MySQL连接管理与连接池优化实战指南
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)) {
// 单次使用后自动关闭
}
关键参数配置
wait_timeout
:非交互式连接空闲超时时间(秒)interactive_timeout
:交互式连接(如MySQL客户端)空闲超时时间
-- 查看当前超时设置
SHOW VARIABLES LIKE '%timeout%';
-- 生产环境推荐设置(根据业务调整)
SET GLOBAL wait_timeout = 600;
SET GLOBAL interactive_timeout = 600;
实践建议
- Web应用推荐使用长连接+连接池组合
- 批处理作业适合短连接模式
- 超时时间设置应大于连接池的
idleTimeout
- 监控
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
连接泄漏检测
常见泄漏场景:
- 未关闭ResultSet/Statement/Connection
- 事务未提交或回滚
- 异常处理路径遗漏资源释放
解决方案:
// 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监控面板查看活跃连接
性能优化参数对照表
参数 | HikariCP | Druid | 推荐值 |
---|---|---|---|
最大连接数 | maximumPoolSize | maxActive | (核心数*2)+1 |
最小空闲连接 | minimumIdle | minIdle | 同最大连接数 |
获取连接超时 | connectionTimeout | maxWait | 3000-10000ms |
连接最大存活时间 | maxLifetime | maxEvictableIdleTime | 30分钟 |
空闲连接超时 | idleTimeout | minEvictableIdleTime | 10分钟 |
3. 生产环境最佳实践
- 连接数公式:
最大连接数 = (核心数 * 2) + 磁盘数
例如4核服务器带SSD:(4*2)+1=9
监控指标:
SHOW STATUS LIKE 'Threads_%'; SHOW PROCESSLIST;
连接验证:
// HikariCP config.setConnectionTestQuery("SELECT 1"); // Druid druid.testOnBorrow=true druid.validationQuery="SELECT 1"
故障排查:
- 连接数突增:检查连接泄漏或突发流量
- 连接获取超时:调整
connectionTimeout
或扩容 - 大量
TIME_WAIT
:优化TCP参数或启用连接复用
通过合理配置连接管理和连接池参数,可以显著提升MySQL数据库的稳定性和性能。建议结合APM工具(如SkyWalking、Prometheus)进行实时监控。