1. 连接池基础概念
1.1 什么是连接池
连接池(Connection Pool)是一种在应用启动时预先创建并维护一组数据库连接(或网络连接)的资源复用技术。应用不再每次请求都新建连接,而是从池中“借出”一个可用连接,使用完毕后再“归还”到池中,从而避免频繁创建和销毁连接带来的性能开销。
核心思想:复用已建立的连接,减少 TCP 三次握手、身份认证、资源分配等重复操作。
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% |
避坑提醒:直连模式在低并发、短连接场景下(如定时任务、批处理脚本)可能比连接池更简单。但任何面向用户的在线服务,必须使用连接池,否则高并发下数据库会因连接风暴而崩溃。
1.4 连接池的典型参数
一个成熟的连接池实现(如 HikariCP、Druid、Tomcat JDBC Pool)通常包含以下核心参数:
| 参数名 | 默认值 | 说明 |
|---|---|---|
initialSize |
10 | 启动时初始化的连接数 |
maxActive |
20 | 最大活跃连接数(池中最多可同时使用的连接) |
minIdle |
5 | 最小空闲连接数,低于此值会补充连接 |
maxWait |
30000 | 获取连接的最大等待时间(毫秒),超时抛异常 |
timeBetweenEvictionRunsMillis |
60000 | 空闲连接回收检测周期(毫秒) |
testWhileIdle |
true | 是否在空闲时检测连接有效性 |