这个问题问得非常好,也是线上最常见的"关联故障"之一。直接给你核心结论:数据库慢查询导致CPU飙高,是因为应用线程在等待数据库响应时并没有"闲下来",而是大量堆积、频繁上下文切换,并且慢查询本身在数据库端消耗CPU,最终双向夹击压垮系统。我分应用端和数据库端两个视角,给你拆解完整的链路。一、从应用端看:慢查询如何让Java应用CPU飙高1. 连接池撑爆 → 线程暴增 → 上下文切换飙升正常流程:应用线程 → 从连接池获取连接 → 执行SQL → 等待结果 → 释放连接慢查询场景:慢SQL执行了10秒 → 应用线程一直占用着连接在等 → 连接池的100个连接很快被占满 → 新请求来了,获取不到连接 → 应用线程阻塞等待(WAITING) → 线程池继续创建新线程来处理新请求(如果线程池未限制)→ 线程数从200暴涨到2000 → 大量线程频繁被挂起/唤醒 → 上下文切换(Context Switch)暴增 → sy(内核态CPU)飙高到30%~50%top特征:# 应用服务器上看top%Cpu(s):25.0us,35.0sy,0.0ni,38.0id,2.0wasy明显偏高(20%),说明大量CPU消耗在线程调度上。2. 连接超时重试 → 雪上加霜// 很多框架的默认行为conn.setQueryTimeout(5);// 5秒超时// 慢查询执行了10秒,触发超时异常// 应用层捕获异常后,自动重试retryTemplate.execute(ctx-{returnjdbcTemplate.queryForList(sql);// 又发一次/