请从连接复用、限流保护、常见参数(最大连接数、最小空闲、获取超时、空闲检测)三个角度回答,并说明连接池打满时会发生什么。
题目:数据库连接池的作用是什么?核心参数有哪些?
难度:low
标签:db/connection-pool,db/performance
评分:⭐⭐⭐☆☆(3/5)
数据库连接池的作用是管理数据库连接,通过复用连接快速执行 SQL、快速反馈数据,防止每次建立新连接浪费时间和资源。连接被打满之后,整个数据库会出现无法访问、无法使用的情况,因为没有连接给其他服务用了。之前出现过类似情况:一个超大 SQL 加上并发量上来,把连接都占满,导致系统宕机,后来临时把接口注掉才恢复。核心参数是最大连接数、回收时间。
优点:连接复用与打满后果都有实感,案例讲得清楚。
不足:把「连接池打满」说成「数据库不可用」不准确——是应用线程阻塞在 getConnection(),超时抛异常,进而拖垮业务线程池;参数只报了两个。
补充:minimumIdle / maximumPoolSize / connectionTimeout / idleTimeout / maxLifetime(< DB wait_timeout)/ leakDetectionThreshold;池大小要匹配 DB max_connections 与后端真实并发。
连接池本质是「有界资源池 + 排队 + 超时熔断」。复用省掉 TCP 握手与认证开销;maximumPoolSize 是限流阀,保护数据库;connectionTimeout 把排队失败快速暴露;maxLifetime 短于服务端 wait_timeout,避免拿到被 MySQL 单方面关闭的死连接;leakDetectionThreshold 抓未归还连接。
QPS × RT 估并发,再压测校准,不是越大越好。leakDetectionThreshold + 池活跃数长期贴顶 + 堆栈采样。max_connections 与池上限的关系?——所有实例池上限之和必须留余量给运维与备份连接。【一句话结论】 连接池是数据库前面的有界缓冲,用复用省开销,用上限保数据库。
【三点展开】 第一,作用是复用连接、限流保护,避免每次请求都建连。第二,核心参数是最大连接数、最小空闲、获取超时、空闲回收和最大存活时间,最大存活要小于数据库的 wait_timeout。第三,池打满不是数据库挂了,是应用线程卡在获取连接,超时后异常上抛,进而把业务线程池拖满,形成雪崩。
【一句边界】 连接池只能保护数据库,救不了慢 SQL;慢 SQL 占满连接时,先限流和杀慢查询,再谈扩容。