连接池调优没有“万能值”,核心思路是:让连接数既能支撑并发,又不浪费资源,同时避免连接耗尽或频繁创建销毁。下面从通用原则 → 关键参数 → 不同组件示例 → 排查思路系统说明。
连接池调优主要解决 4 类问题:
Unable to get connection✅ 理想状态:
| 参数 | 含义 | 调优建议 |
|---|---|---|
| 最小连接数(minIdle) | 池中常驻连接 | 一般 = 日常并发 |
| 最大连接数(maxTotal / maxPoolSize) | 允许的最大连接 | 关键参数,不能乱设 |
| 初始连接数(initialSize) | 启动时创建 | 一般 = minIdle |
| 获取连接超时(maxWait / connectionTimeout) | 拿不到连接等多久 | 建议 1~5 秒 |
| 空闲连接回收时间 | 回收多余空闲连接 | 防止资源浪费 |
| 连接最大生命周期 | 防止长时间连接异常 | 建议 < 数据库 wait_timeout |
最大连接数 ≈
单位时间内并发请求数
÷ 单个请求平均占用连接时间(秒)
× 安全系数(1.2~1.5)
从数据库侧反推:
show status like 'Threads_connected';
show status like 'Max_used_connections';
Max_used_connections ≈ 历史峰值max 可设为:Max_used_connections × 1.2
⚠️ 不要盲目设 1000、2000
❌ 最大连接数过大
→ 数据库线程切换、内存暴涨
❌ 最大连接数过小
→ 高并发时大量请求阻塞
❌ 没有设置获取超时
→ 线程无限等待,系统假死
❌ 连接泄漏(忘记 close)
→ 连接池慢慢耗尽
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 10
connection-timeout: 3000
idle-timeout: 600000
max-lifetime: 1800000
| 参数 | 建议 |
|---|---|
| maximum-pool-size | 10~40(常见) |
| minimum-idle | 与 max 接近或略小 |
| connection-timeout | 3s |
| max-lifetime | < MySQL wait_timeout |
✅ Hikari 官方建议:
minimum-idle 不设或接近 max,避免频繁扩缩容
spring:
datasource:
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 3000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
test-while-idle: true
validation-query: SELECT 1
✅ Druid 建议:
c3p0.maxPoolSize=20
c3p0.minPoolSize=5
c3p0.checkoutTimeout=3000
⚠️ 性能不如 Hikari,新项目不建议
show variables like 'max_connections';
show variables like 'wait_timeout';
建议:
| 参数 | 建议 |
|---|---|
| max_connections | 大于所有连接池 max 之和 |
| wait_timeout | 8h(28800)是默认值,建议调小 |
| interactive_timeout | 同 wait_timeout |
✅ 一般:
连接池 max-lifetime < wait_timeout
timeout / pool exhaustedThreads_connected 是否稳定✅ 先算,再压,再调
✅ 连接数不是越大越好
✅ 优先调 max + timeout
✅ 一定要监控,不要拍脑袋
你可以直接告诉我:
我可以给你一套可直接上线的参数建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。