做Web开发时,经常听到“连接池”这个词,特别是在和MySQL打交道的时候。你可能已经写好了查询语句,接口也跑通了,但一到高并发就卡顿、超时,问题很可能出在连接池大小没调好。
连接池是啥?
想象一下银行柜台,客户来了要办业务,柜员就是数据库连接。如果每次来人都临时叫一个柜员上班,效率肯定低。于是银行决定提前安排几个柜员待命,谁来就直接服务——这就是连接池。它预先建立好一批数据库连接,等程序要用的时候直接拿,用完放回去,不用每次都重新连接。
为什么连接池大小很重要?
设得太小,比如只有5个连接,但网站突然来了100个用户同时请求数据,那80多个请求只能干等着,页面就卡住了。设得太大,比如500个,MySQL可能扛不住,直接报错“Too many connections”,服务器内存也被吃光,反而拖垮整个系统。
MySQL默认最大连接数一般是151,最多能撑到几千,但每个连接都会消耗内存和CPU资源。实际项目中,不是越多越好,而是要匹配你的业务场景。
怎么定一个合适的值?
先看你的应用类型。如果是内部管理系统,一天几百访问量,连接池设20~30就够了。但要是电商秒杀活动,瞬时并发上千,那就得仔细算。
有个经验公式可以参考:连接池大小 = (平均请求处理时间 × 并发请求数)/ 请求响应时间。更简单点,可以用监控工具看看高峰期数据库连接的使用情况。比如用Prometheus + Grafana,或者直接查MySQL状态:
SHOW STATUS LIKE 'Threads_connected';
这个命令能告诉你当前有多少连接正在用。如果经常接近你设的上限,就得考虑扩容。
常见框架里的配置示例
比如用Java的HikariCP,配置看起来像这样:
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
这里最大20个连接,适合中小项目。如果发现日志里频繁出现“connection timeout”,说明不够用了。
Python用SQLAlchemy配合pymysql的话:
from sqlalchemy import create_engine
engine = create_engine(
"mysql+pymysql://user:pass@localhost/db",
pool_size=10,
max_overflow=20
)
# 实际最大连接数是 pool_size + max_overflow = 30
注意max_overflow不是随便写的,它代表超出基础池大小后还能临时创建多少连接,超过就会排队。
别忘了调整MySQL本身的限制
你程序里设了100个连接,但MySQL自己只允许50个,那就白搭。进MySQL改配置:
SET GLOBAL max_connections = 200;
还要记得在my.cnf里持久化这个设置,不然重启就回去了。
线上调优要小心
曾经有个同事把连接池从20直接拉到200,结果第二天数据库负载飙到90%,CPU一直满载。查下来发现是大量空闲连接占着资源没释放。后来加上idle-timeout和max-lifetime控制,才稳住。
连接池不是设完就一劳永逸,得结合监控看。比如每天早晚高峰有没有连接等待?有没有频繁创建销毁连接?这些都能反映配置合不合理。