1. 课程导论:慢查询的定义、连接池与熔断的基本概念、协同解决慢查询的必要性
1.1 慢查询的定义与判定标准
慢查询(Slow Query)是指执行时间超过预设阈值的数据库查询语句。在微服务与高并发架构中,慢查询是导致系统吞吐量下降、连接耗尽、级联故障的核心诱因之一。
| 判定维度 | 典型阈值 | 说明 |
|---|---|---|
| 单次执行耗时 | > 100ms(OLTP) | 超过业务可接受延迟的查询即视为慢查询 |
| 扫描行数 | > 10,000 行 | 全表扫描或索引失效导致大量数据扫描 |
| 锁等待时间 | > 1s | 行锁或表锁竞争导致查询阻塞 |
| 返回数据量 | > 1MB | 大字段或未分页查询导致网络传输瓶颈 |
关键认知: 慢查询不一定是 SQL 语法错误,更多源于索引缺失、数据倾斜、连接数不足或锁冲突。在连接池视角下,慢查询会长时间占用连接,导致池内连接被“饿死”。
1.2 连接池的基本概念
连接池(Connection Pool)是预先创建并维护一组数据库连接的管理组件,应用程序从池中借用连接,使用完毕后归还,避免频繁创建/销毁连接的开销。
- 核心参数: 最小连接数(minIdle)、最大连接数(maxActive)、等待超时(maxWait)、空闲回收(idleTimeout)。
- 工作模式: 连接复用 → 请求排队 → 超时拒绝。
- 常见实现: HikariCP、Druid、Tomcat JDBC Pool。
连接池的脆弱点: 当慢查询发生时,连接被长时间占用,池中可用连接迅速减少。后续请求排队等待,最终触发 maxWait 超时,导致连接池耗尽(Connection Pool Exhaustion)。
1.3 熔断的基本概念
熔断(Circuit Breaker)是一种保护机制,当下游服务(如数据库)的故障率达到阈值时,熔断器打开,直接拒绝请求,避免系统资源被无效等待耗尽。
| 熔断状态 | 行为 | 恢复条件 |
|---|---|---|
| 关闭(Closed) | 正常请求通过 | — |
| 打开(Open) | 请求直接失败(快速失败) | 等待超时窗口(如 5s) |
| 半开(Half-Open) | 放行少量探测请求 | 探测成功则关闭,失败则重新打开 |
常见误区: 熔断不是降级,降级是返回默认值或缓存数据;熔断是直接拒绝请求,防止故障扩散。在数据库场景中,熔断可以保护连接池不被慢查询瞬间击穿。
1.4 协同解决慢查询的必要性
单独使用连接池或熔断都无法根治慢查询带来的系统风险。连接池只能管理连接复用,无法识别慢查询;熔断只能做故障隔离,无法优化连接利用率。两者协同才能形成完整的防护体系。
1.5 协同的核心收益
| 场景 | 仅连接池 | 仅熔断 | 协同方案 |
|---|---|---|---|
| 慢查询爆发 | 连接池耗尽,请求排队超时 | 熔断打开,但连接池仍被占用 | 熔断提前阻断,连接池快速回收 |
| 数据库恢复 | 连接池缓慢恢复 | 熔断半开探测,但连接池无感知 | 熔断探测成功后通知连接池扩容 |
| 资源利用率 | 连接复用,但无法识别慢查询 | 快速失败,但无连接管理 | 连接池管理连接,熔断管理流量 |
课程目标: 本课程将深入讲解连接池参数调优、熔断阈值设计、慢查询识别与隔离策略,并通过实战案例展示两者协同的完整落地路径。你将学会如何构建一套“连接池 + 熔断”的双层防护体系,从容应对慢查询引发的系统雪崩。