做开发这些年,见过太多项目因为一个小小的连接池配置不当,上线没几天就挂了。尤其是用 MySQL 的系统,连接池大小设不对,轻则响应慢,重则数据库直接被打崩。今天就聊聊这个看似不起眼、实则影响巨大的参数——MySQL 连接池大小。
连接池不是越大越好
很多人一看到数据库响应慢,第一反应就是“加连接”。把连接池从 10 改成 50,再改成 100,觉得反正越多越快。其实这是误区。MySQL 能同时处理的连接数是有限的,官方建议一般不超过 200~300 个活跃连接。你应用层开 200 个连接,每个都在抢资源,数据库 CPU 直接拉满,反而更卡。
举个生活化的例子:你去银行办事,窗口就那么几个。就算大厅里挤满了人(连接池很大),真正能办理业务的也就那几个窗口在忙。人越多,排队越乱,保安还得花精力维持秩序(数据库花资源管理连接)。
怎么定一个合适的大小?
先看你的应用类型。如果是内部管理系统,几十个并发,连接池设 10~20 就够了。但要是电商秒杀系统,高峰期上千请求,就得仔细算。
一个常用的估算公式是:
连接池大小 = (平均事务处理时间 × QPS) / 期望响应时间
比如你每秒处理 50 个请求(QPS=50),每个事务平均耗时 200ms,希望用户等待不超过 500ms,那连接池大概需要:
(0.2 × 50) / 0.5 = 20
也就是 20 个左右。当然这只是一个起点,实际还得压测调优。
结合线程池一起看
很多人只调连接池,忽略了应用本身的线程池。如果 Web 服务器线程池开了 200 个线程,每个线程都要操作数据库,但连接池只有 10 个,那 190 个线程都在等连接,系统就卡住了。反过来,连接池开太大,数据库顶不住。
建议两者匹配:Web 线程池大小和数据库连接池尽量接近,避免出现“生产太快、消费太慢”的情况。
常见框架的默认值
不少开发者直接用框架默认配置,结果出问题。比如 HikariCP 默认最大连接是 10,C3P0 是 15,DBCP 是 8。这些对小项目没问题,但流量一上来就不够用了。
如果你用的是 Spring Boot + HikariCP,可以在 application.yml 里这样改:
spring:\n datasource:\n hikari:\n maximum-pool-size: 20\n minimum-idle: 5\n connection-timeout: 30000\n idle-timeout: 600000\n max-lifetime: 1800000
这里的 20 是根据前面估算来的,别盲目写 100 或 200。
监控比设置更重要
设完不代表完事。得看运行时表现。比如通过 SHOW STATUS LIKE 'Threads_connected'; 查当前连接数,或者用 Prometheus + Grafana 看连接池使用率。如果经常接近最大值,说明得扩容;如果长期用不到一半,那就是浪费资源。
线上系统最怕“静态配置,动态变化”。今天好好的,明天搞个活动,流量翻倍,连接池不够,服务就雪崩了。定期 review 配置,比一次设到位更重要。