你有没有遇到过这种情况:公司后台系统早上刚上班就卡得不行,刷新半天打不开页面。查了一圈服务器资源,CPU、内存都没问题,最后发现是数据库连接池的锅——最大空闲数设得太小,新请求连不上,老连接又不够用。
啥是连接池最大空闲数
简单说,连接池就是提前建好一堆数据库连接,等着程序随时取用。最大空闲数(maxIdle)指的是:连接池里最多能“闲着”的连接数量。比如设成10,那就最多留10个空闲连接,超过的就会被关掉。
这个值看着不起眼,但调不好直接影响系统响应速度。设太小,每次都要重新建连接,耗时又费资源;设太大,又浪费数据库连接资源,可能把数据库拖垮。
真实场景:促销活动崩了
有次电商搞大促,流量涨了五倍。系统扛住了前端压力,结果数据库连接池最大空闲数还是原来的5,高峰期根本不够分。用户下单一直转圈,客服电话被打爆。后来把maxIdle调到50,配合最大连接数一起优化,问题才解决。
怎么设才合理
别照抄别人配置。先看平时有多少并发请求在用数据库。比如监控显示平均同时有8个连接在跑,那最大空闲数可以设成10~15,留点余量。如果应用是白天忙晚上闲,也可以适当降低,避免资源闲置。
常见框架里,比如用Druid连接池,配置长这样:
spring.datasource.druid.max-idle=20
spring.datasource.druid.min-idle=5
spring.datasource.druid.initial-size=5
这里max-idle就是最大空闲数。注意它不能大于最大连接数(max-active),否则没意义。
别只盯着一个参数
最大空闲数要和最小空闲数、最大连接数、超时时间一块调。比如最小空闲设太低,连接池启动后只有两三个连接,突发流量来了也顶不住。建议最小空闲设成maxIdle的一半左右,冷启动时也能撑住。
另外,空闲连接不是永远留着。大多数池子都有“空闲回收”机制,比如超过30分钟不用就自动断开。这个时间也可以调,避免连接僵死占资源。
调完记得压测验证。模拟高峰流量看看会不会丢连接,监控连接使用率是否稳定。别等到线上出事再改。