MySQL连接管理与连接池优化实战指南
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_timeout | 28800秒(8小时) | 非交互式连接空闲超时 |
interactive_timeout | 28800秒 | 交互式连接(如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分钟
连接池参数对比:
实践建议:
- 连接数 = (核心数 * 2) + 有效磁盘数 (适用于CPU密集型)
- 监控连接池指标:活跃连接、空闲连接、等待线程数
- 不同微服务使用独立连接池
连接泄漏检测与预防
常见泄漏场景:
- 未关闭Connection/Statement/ResultSet
- 事务未提交或回滚
- 异常处理中遗漏资源释放
检测方法:
// HikariCP泄漏检测日志示例
WARN com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered
预防措施:
使用try-with-resources语法:
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { // 处理结果 }
Spring事务管理:
@Transactional public void updateData() { // 业务代码 }
监控工具配置:
-- 查看当前连接状态 SHOW PROCESSLIST;
实践建议:
- 开发环境设置较短的leakDetectionThreshold(如5秒)
- 生产环境定期检查连接数异常增长
- 使用APM工具(如SkyWalking)监控连接生命周期
总结对比表
特性 | 长连接 | 短连接 | 连接池 |
---|---|---|---|
创建开销 | 高 | 极高 | 中 |
内存占用 | 高 | 低 | 中 |
并发能力 | 中 | 低 | 高 |
适用场景 | 低频长事务 | 简单脚本 | 高并发Web应用 |
管理难度 | 高 | 低 | 中 |
通过合理配置连接管理和连接池参数,可以显著提升MySQL数据库的并发处理能力和稳定性。建议根据实际业务场景进行压力测试,找到最佳配置参数。