当前位置:首页 > 文章列表 > 文章 > java教程 > HikariCP 连接池耗尽排查:别一上来就把 maximumPoolSize 调大

HikariCP 连接池耗尽排查:别一上来就把 maximumPoolSize 调大

来源:17golang Java频道原创 2026-06-04 13:34:13 0浏览 收藏

这篇写一个 Java 后端非常典型的生产故障:Spring Boot 服务突然大量报 Connection is not available, request timed out,接口 p99 飙升,线程堆栈里一片等连接。第一反应如果只是把 maximumPoolSize 从 20 改成 80,通常只是把事故往后推了一点。

本文适用于 Java 17/21、Spring Boot 3.x、HikariCP、MyBatis/JPA 常见服务。资料只用于核对事实:Spring Boot 默认连接池常见实现是 HikariCP,Actuator/Micrometer 能暴露 Hikari 连接池指标。正文按线上排查复盘写,重点是找到连接为什么没有及时归还。

HikariCP 连接池耗尽排查思维导图
脑图:池满只是结果,真正要看现象、指标、根因和上线闭环。

业务场景:订单接口突然排队

我们有一个订单详情接口,平时 QPS 不高,但活动页会把它打成热点。服务使用 Spring Boot 3、MyBatis、HikariCP,数据库连接池最大 20。某天活动开始后,接口从 80ms 变成 2s 以上,日志里反复出现获取连接超时。

一开始有人建议把连接池改成 80。这个动作不是绝对不能做,但它应该是容量评估后的结果,不应该是第一反应。连接池满了说明连接被占住了,先要找谁占着、占多久、为什么不回来。

问题复现:把慢点放进事务里

最小复现很简单:开一个 20 大小的池,在 @Transactional 方法里先查订单,再调用一个慢 500ms 的远程接口,最后再更新访问记录。压测一上来,数据库连接并不是只服务 SQL,而是陪着远程接口一起等待。

这个坑很隐蔽,因为代码看起来业务顺序没问题:查订单、查库存、组装返回。但从连接池视角看,事务没结束,连接就不能归还。高峰时每个请求多占 500ms,20 个连接很快全部被占满。

HikariCP 连接池耗尽诊断流程
排查流程:从报错和指标开始,再进入线程、SQL 和事务边界。

踩坑原因:连接池不是线程池

很多人会把连接池当成“数据库线程池”,觉得大一点就更能扛。实际上连接池是一个稀缺资源闸口,连接越多,数据库端压力也越大。应用把池调大,数据库未必接得住,锁等待、IO、CPU 都可能继续放大。

HikariCP 的优势是轻量和稳定,但它不会替你修复慢 SQL、长事务、连接泄漏、错误的流式查询关闭方式。池满时先调大参数,就像听到烟雾报警器响了先把电池拆掉。

代码案例:快拿快还,别把远程调用塞进事务

下面的对比是我 review Java 项目时经常指出的问题。坏写法里,事务包住了远程调用;好写法里,数据库操作尽量短,远程补充信息放到事务外,并且连接池参数更强调快速失败和泄漏发现。

HikariCP 连接池配置和代码对比
生产目标不是让连接池无限等,而是快失败、快定位、快归还。
@Service
public class OrderQueryService {
    private final OrderMapper orderMapper;
    private final StockClient stockClient;

    public OrderDetail detail(long orderId) {
        Order order = loadOrder(orderId); // 事务短,连接尽快归还
        Stock stock = stockClient.query(order.getSkuId());
        return OrderDetail.of(order, stock);
    }

    @Transactional(readOnly = true)
    public Order loadOrder(long orderId) {
        return orderMapper.selectById(orderId);
    }
}

如果你用 JPA,也要注意懒加载边界。事务外访问懒加载字段会抛异常,事务里做太多事情又会拉长连接占用时间。我的习惯是查询层返回明确 DTO,少把实体对象带着事务上下文到处跑。

诊断步骤:我会按这六个证据查

第一,看 Hikari 指标。 重点不是只看 active,而是 active、idle、pending、timeout 一起看。active 接近 max、idle 长时间为 0、pending 增长,基本就能确认池处于耗尽状态。

第二,看慢 SQL。 如果 SQL 本身 2 秒,连接当然 2 秒回不来。先找 top SQL、执行计划、锁等待,再谈连接池。

第三,看事务边界。 搜索 @Transactional 方法里是否有远程 HTTP、消息发送、文件处理、复杂计算。事务越长,连接占用越久。

第四,看连接泄漏。 可以在预发或短时间生产窗口打开 leakDetectionThreshold,让日志指出可能长时间未归还连接的调用栈。阈值不要设太低,否则会制造噪音。

第五,看线程堆栈。 如果大量业务线程卡在获取连接,说明池已经成为入口瓶颈;如果大量线程卡在数据库驱动读写,说明连接拿到了但 SQL 或网络慢。

第六,看数据库端。 应用侧只能看到池,数据库侧才能看到锁、活跃会话、慢查询和资源水位。两边时间线要对齐。

上线检查:改参数也要有理由

  • maximumPoolSize 要结合数据库承载、实例数、接口并发和 SQL 耗时估算。
  • connectionTimeout 不要过长,用户请求等 60 秒通常没有意义。
  • 长事务必须拆短,远程调用、文件处理、消息发送不要放在事务里。
  • hikaricp.connections.activeidlependingtimeout 做告警。
  • 灰度后对比 p95/p99、数据库慢 SQL、连接池 pending 和错误率。

我的经验总结

HikariCP 连接池耗尽很少是单一参数问题。更多时候,它是慢 SQL、长事务、下游抖动、连接泄漏和容量估算一起暴露出来的结果。你可以调参数,但要先拿到证据。

我最推荐的处理顺序是:先恢复服务,限制流量或临时扩容;再用指标和堆栈定位连接占用;最后缩短事务、优化 SQL、补齐告警。Java 后端服务要稳,不是把池调到最大,而是让每个连接都尽快、有序、可观测地回家。

版本声明
本文转载于:17golang Java频道原创 如有侵犯,请联系study_golang@163.com删除
WebFlux 里 block() 卡死事件循环:一次 p99 飙升的排查复盘WebFlux 里 block() 卡死事件循环:一次 p99 飙升的排查复盘
上一篇
WebFlux 里 block() 卡死事件循环:一次 p99 飙升的排查复盘
Go HTTP 客户端超时实战:别让默认 Client 拖垮 goroutine
下一篇
Go HTTP 客户端超时实战:别让默认 Client 拖垮 goroutine
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    5963次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    6383次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    6193次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    8167次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    6773次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码