1. 连接池基础概念

1.1 什么是连接池

连接池(Connection Pool)是一种在应用启动时预先创建并维护一组数据库连接(或网络连接)的资源复用技术。应用不再每次请求都新建连接,而是从池中“借出”一个可用连接,使用完毕后再“归还”到池中,从而避免频繁创建和销毁连接带来的性能开销。

核心思想:复用已建立的连接,减少 TCP 三次握手、身份认证、资源分配等重复操作。
连接池工作原理示意 应用线程 连接池 连接 1 连接 2 连接 3 连接 4 连接 5 (等待) 数据库 借出 归还 复用 ● 绿色:空闲可用连接 ● 红色:已被借出或等待中的连接 ● 应用线程通过“借出/归还”模式与池交互,池负责连接生命周期管理

1.2 连接池的核心作用

连接池在性能调优中承担四个关键职责,缺一不可:

作用维度 具体说明 性能影响
连接复用 池内连接可被多个请求循环使用,避免重复建连 减少 TCP 握手 + 认证时间,单次可节省 10~50ms
资源管控 限制最大连接数,防止数据库被突发流量打满 避免 OOM 和数据库连接风暴
快速响应 连接已就绪,请求到达时无需等待建连 首次请求延迟降低 80% 以上
健康检测 定期检测连接有效性,自动剔除失效连接 避免请求因连接断开而失败
实践要点:连接池不是越大越好。过大的池会占用数据库连接资源,反而导致数据库性能下降。通常建议初始连接数 = 应用核心线程数 × 1.5,最大连接数不超过数据库 max_connections 的 70%。

1.3 连接池 vs 直连:性能对比

直连模式(每次请求新建连接)与连接池模式在性能上存在显著差异。以下通过一个典型 Web 请求的耗时分解来对比:

对比维度 直连模式 连接池模式 性能差距
TCP 三次握手 每次请求都执行 仅首次建连执行 节省约 1~3ms
数据库认证 每次请求都执行 仅首次建连执行 节省约 5~20ms
连接创建开销 每次分配 socket 资源 从池中直接获取 节省约 2~10ms
并发上限 受系统文件描述符限制 受池大小限制,可控 池模式更稳定
平均响应时间 (RT) 高,含建连延迟 低,连接即用 池模式 RT 降低 40%~70%
数据库负载 频繁建连/断连,CPU 高 连接稳定,CPU 低 池模式 CPU 降低 30%~50%
直连 vs 连接池:请求耗时对比(单位:ms) 直连 ~35ms TCP握手 3ms 认证 15ms 业务查询 17ms 连接池 ~17ms 取连接 1ms 业务查询 16ms 节省 51% 关键差异 ● 直连:每次请求都经历 TCP握手 + 认证 + 建连 ● 连接池:连接已就绪, 仅需从池中取出 ● 高并发下差距更明显
避坑提醒:直连模式在低并发、短连接场景下(如定时任务、批处理脚本)可能比连接池更简单。但任何面向用户的在线服务,必须使用连接池,否则高并发下数据库会因连接风暴而崩溃。

1.4 连接池的典型参数

一个成熟的连接池实现(如 HikariCP、Druid、Tomcat JDBC Pool)通常包含以下核心参数:

参数名 默认值 说明
initialSize 10 启动时初始化的连接数
maxActive 20 最大活跃连接数(池中最多可同时使用的连接)
minIdle 5 最小空闲连接数,低于此值会补充连接
maxWait 30000 获取连接的最大等待时间(毫秒),超时抛异常
timeBetweenEvictionRunsMillis 60000 空闲连接回收检测周期(毫秒)
testWhileIdle true 是否在空闲时检测连接有效性