首页/数据/SQL 速查/连接数与连接池观察
性能与执行计划72 条

连接数与连接池观察

连接不是越多越好:数据库侧连接开销(线程或进程、内存)与应用池配置要匹配,短事务配够用的小池。

SQL 速查数据更新于 2026-10-13

连接不是越多越好

MySQL 每个连接对应一个线程,PostgreSQL 每个连接对应一个进程,连接数往上走,内存与上下文切换开销都跟着涨。连接池的作用是把连接复用起来并限制并发上限,池大小要跟应用并发量和数据库承载能力匹配,不是越大越好。

基本信息

MySQL 连接模型每连接一个线程,连接多则线程与内存开销大
PostgreSQL 连接模型每连接一个进程,常配合外部连接池
MySQL 常用指标Threads_connected、Threads_running、max_connections
关键状态idle in transaction:空闲事务持锁并阻碍清理
池大小估算参考并发量与单查询响应时间,而非拍脑袋取上限

典型使用场景

  • 排查连接数打满导致的报错
  • 数据库内存被大量空闲连接吃掉
  • 调整池大小前先量化真实并发
  • 发现长事务阻碍系统清理
  • 容器化部署后连接数暴涨

MySQL 观察

MySQL 观察
-- 当前连接数与正在执行的连接数
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Threads_running';

-- 上限与空闲回收时间
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';

PostgreSQL 观察

PostgreSQL 观察
-- 按状态统计连接
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;

-- 重点关注长时间空闲的事务
SELECT pid, state, xact_start, query
FROM pg_stat_activity
WHERE state = 'idle in transaction'
ORDER BY xact_start;

指标怎么读

指标含义怎么用
Threads_connected当前连接数接近上限就要扩容或排查泄漏
Threads_running正在执行的连接数远低于连接总数说明多数连接在空闲
max_connections连接数上限调高上限也要同步评估内存
idle in transaction开了事务却不干活的连接持锁并阻碍清理,需要回收
wait_timeout空闲连接回收时间与连接池的空闲回收配合设置
连接池不是缓冲池:池里的连接在数据库侧始终占用资源,池开得太大只是把压力从应用挪到数据库,问题会在高峰期集中爆发。
idle in transaction 最值得警惕:它持有锁、阻碍清理,通常还意味着应用忘了提交事务。连接池要配空闲回收与事务超时做兜底。

易错点

  • 把池开到数据库上限:忙时全量竞争、抖动放大,应按响应时间与并发量估算池大小
  • 忽略 idle in transaction:空闲事务阻塞清理并持锁,需要连接回收与事务超时兜底
  • 只看连接总数不看运行数:多数连接空闲说明池开大了,白白占用数据库内存
  • 把提高 max_connections 当扩容手段:每连接都有内存成本,调上限前先算内存
  • 容器环境没有回收策略:短时并发会打满连接,需配连接泄漏检测与超时

数据来源与参考

  • MySQL 8.0 Reference Manual · Connection Management
  • PostgreSQL Documentation · Monitoring Database Activity
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌