题目中描述的现象是:Web应用的CPU使用率正常,但响应时间随着并发数增加而急剧上升。这表明系统并未因CPU计算能力不足而受限(排除A),也未表现出内存持续增长(暂不支持C),磁盘空间不足通常会导致写入失败或IO错误,而非单纯响应延迟(排除D)。而数据库连接池耗尽时,后续请求需排队等待可用连接,导致请求处理延迟显著上升,且该过程不显著占用CPU(因线程常处于阻塞等待状态),与现象高度吻合。因此,最可能的瓶颈是B. 数据库连接池耗尽。
数据库连接池耗尽时,应用日志中常见的典型错误或警告信息取决于所用连接池实现(如 HikariCP、Druid、DBCP 等),但共性明显,主要包括以下几类:
✅ 超时获取连接失败(最常见)
HikariCP:
HikariPool-1 - Connection is not available, request timed out after XXX ms.
Failed to get connection from pool: java.sql.SQLTimeoutException: Timeout waiting for connection.
✅ 拒绝新连接(连接池已满且无空闲连接)
Druid:
druid.pool.GetConnectionTimeoutException: wait millis XXX, active 20, maxActive 20
(表示活跃连接数已达最大值,且等待超时)
✅ 线程阻塞/等待堆栈线索
- 日志中可能伴随大量线程处于
BLOCKED或WAITING状态,堆栈含:
com.zaxxer.hikari.pool.HikariPool.getConnection()
javax.sql.DataSource.getConnection()
表明业务线程卡在获取连接阶段。
✅ 框架层间接报错(非直接SQL异常)
- Spring Boot + MyBatis:
org.springframework.dao.DataAccessResourceFailureException: Failed to obtain JDBC Connection - Spring Transaction:
Could not obtain transaction-synchronized Session for current thread(Hibernate场景)
⚠️ 注意:不会出现典型的 OutOfMemoryError 或 CPU high 日志,也极少报 SQLException: Connection refused(那是数据库服务不可达,而非池耗尽)。

1019

被折叠的 条评论
为什么被折叠?



