数据库连接池监控最佳实践:用 Prometheus + Grafana 打造可视化监控体系


网罗开发 (小红书、快手、视频号同名)

大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验 。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员

👋 大家好,我是展菲!

📱 全网搜索"展菲",即可纵览我在各大平台的知识足迹。

📣 公众号"Swift社区",每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。

💬 微信端添加好友"fzhanfei",与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。

📅 最新动态:2025 年 3 月 17 日

快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!

文章目录

    • 前言
    • 摘要
    • 描述
    • [开始动手:HikariCP 如何导出 Metrics](#开始动手:HikariCP 如何导出 Metrics)
      • [第一步:引入依赖(可运行 Demo)](#第一步:引入依赖(可运行 Demo))
      • [第二步:开启 Actuator + Prometheus 端点](#第二步:开启 Actuator + Prometheus 端点)
      • [第三步:Prometheus 抓取连接池指标](#第三步:Prometheus 抓取连接池指标)
      • [第四步:Grafana 连接 Prometheus 并绘制图表](#第四步:Grafana 连接 Prometheus 并绘制图表)
    • 最关键的监控指标:企业级项目必备
      • [1. 当前 active / idle 连接](#1. 当前 active / idle 连接)
      • [2. 连接池使用率](#2. 连接池使用率)
      • [3. 连接创建频率 spike(判断是否有泄漏)](#3. 连接创建频率 spike(判断是否有泄漏))
      • [4. 连接 borrow 超时](#4. 连接 borrow 超时)
      • [5. Pending 连接数](#5. Pending 连接数)
    • [可运行代码 Demo:模拟连接被占满](#可运行代码 Demo:模拟连接被占满)
    • 实际业务场景:如何用监控定位问题?
      • [场景 1:某个接口突然活跃度暴增](#场景 1:某个接口突然活跃度暴增)
      • [场景 2:连接泄漏](#场景 2:连接泄漏)
      • [场景 3:连接池配置过小](#场景 3:连接池配置过小)
    • 监控最佳实践
    • 总结

前言

很多后端开发者都遇到过数据库连接池突然耗尽导致系统卡死的情况。

尤其是高峰时段,连接池的 active 数量不断攀升,超过 threshold 就开始报错,甚至连正常请求都被阻塞。

但问题来了:

  • 我们怎么知道连接池是否快被耗尽?
  • 怎么发现哪个接口在疯狂消耗连接?
  • 怎么提前预警而不是等到线上崩溃?

数据库连接池泄漏、连接数飙升、慢查询过多------这些问题其实都可以通过 Prometheus + Grafana 很轻松地提前发现。

这篇文章会从零开始,教你如何用 HikariCP + Spring Boot + Prometheus + Grafana 搭建一个完全可运行的监控系统,并给出实际场景分析和最佳实践。

摘要

文章将带你完成以下内容:

  1. 打开 HikariCP 的指标输出
  2. 配置 Prometheus 采集指标
  3. 使用 Grafana 绘制实时可视化面板
  4. 实际业务场景中的监控指标
  5. 可运行 Demo 代码和 yaml 配置

整个流程是完全可复制的。

描述

数据库连接池是系统的血管。

它的状态,直接反映你的系统是否健康。

常见的问题包括:

  • active 连接数突然飙高
  • 空闲连接越来越少
  • borrow 超时等待
  • connection creation spike
  • 连接泄漏
  • 不合理的池最大连接数配置

但如果没有监控,你完全无法提前知道这些变化。

而 Prometheus + Grafana 能在第一时间告诉你:

  • 哪个接口突然占用了大量连接
  • 连接池使用率趋势
  • 是否连接泄漏
  • 是否需要扩容数据库或调整池配置

这不是锦上添花,而是保证线上稳定性的基础设施。

开始动手:HikariCP 如何导出 Metrics

Spring Boot 默认就支持 Micrometer + Prometheus,我们只需要启用即可。

第一步:引入依赖(可运行 Demo)

xml 复制代码
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

解析:

  • micrometer-registry-prometheus 用来把监控指标暴露给 Prometheus
  • Spring Boot Actuator 已经自动集成 HikariCP 的所有指标

这意味着你什么都不用写,连接池指标自动会出现在 /actuator/prometheus

第二步:开启 Actuator + Prometheus 端点

application.yml

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  metrics:
    tags:
      application: my-service

解析:

  • 让 prometheus 端点公开
  • Prometheus 才能抓取数据
  • 额外给 metrics 增加标签方便区分服务

现在你访问:

复制代码
http://localhost:8080/actuator/prometheus

能看到像这样的一堆指标:

txt 复制代码
hikaricp_connections{pool="HikariPool-1", state="active"} 3
hikaricp_connections{pool="HikariPool-1", state="idle"} 7
hikaricp_connections_timeout_total 5
hikaricp_connections_acquired_total 503
hikaricp_connections_pending 0

这就是我们监控连接池的核心数据。

第三步:Prometheus 抓取连接池指标

Prometheus 配置 prometheus.yml:

yaml 复制代码
scrape_configs:
  - job_name: 'spring-boot'
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8080']

解析:

  • 每 5 秒抓一次指标
  • 指向你的 Spring Boot 服务

启动 Prometheus 后,就能看到连接池的数据被采集了。

第四步:Grafana 连接 Prometheus 并绘制图表

接着就是可视化。Grafana 添加数据源时选择 Prometheus,然后创建 Dashboard。

下面是实际项目中最有价值的监控图表。

最关键的监控指标:企业级项目必备

以下指标是我们在大量线上项目中总结出来的。

1. 当前 active / idle 连接

PromQL:

promql 复制代码
sum(hikaricp_connections{state="active"})
promql 复制代码
sum(hikaricp_connections{state="idle"})

用来判断:

  • 是否有突发性的连接消耗
  • 是否空闲连接越来越少
  • 是否需要扩容池

2. 连接池使用率

promql 复制代码
sum(hikaricp_connections{state="active"})
/
sum(hikaricp_connections)

当使用率长期超过 80% 时:

  • 要么连接池过小
  • 要么慢查询太多
  • 要么代码没关闭连接

这是一个非常重要的预警指标。

3. 连接创建频率 spike(判断是否有泄漏)

promql 复制代码
rate(hikaricp_connections_created_total[5m])

如果持续升高:

  • 说明连接不断被创建,池子不够用了
  • 或者空闲连接被占满
  • 或者出现连接泄漏导致不断创建新连接

这是线上最常见的问题。

4. 连接 borrow 超时

promql 复制代码
increase(hikaricp_connections_timeout_total[5m])

一旦有超时,基本说明连接池已被撑爆。

5. Pending 连接数

promql 复制代码
sum(hikaricp_connections_pending)

pending 说明:

  • 业务在等待连接
  • 数据库压力已经开始影响系统

如果 pending 走高,就是事故前兆。

可运行代码 Demo:模拟连接被占满

下面的 Demo 会故意让连接占用不释放,用来测试监控图表是否能捕获异常情况。

java 复制代码
@RestController
public class LeakTestController {

    @Autowired
    private DataSource dataSource;

    @GetMapping("/leak")
    public String leakConnection() throws Exception {
        Connection conn = dataSource.getConnection();
        Thread.sleep(100000000);  // 故意不关闭
        return "OK";
    }
}

访问十次:

txt 复制代码
curl http://localhost:8080/leak

观察 Prometheus 你会看到:

  • active 连接不断升高
  • idle 连接降低到 0
  • pending 连接上升
  • created_total 变成曲线暴涨
  • timeout_total 开始增加

Grafana 也会实时可视化。

在真实项目里如果有人忘记关连接,你就可以抓住他了。

实际业务场景:如何用监控定位问题?

举几个很典型的场景。

场景 1:某个接口突然活跃度暴增

看到 active spikes 飙升,你可以立刻反推:

  • 是不是新版本发布引入了慢 SQL
  • 新业务导致读写压力增加
  • 是否有 batch 任务压垮了数据库

场景 2:连接泄漏

泄漏的明显特征:

  • idle 越来越少
  • active 越来越高
  • created_total 持续增长(不正常)
  • timeout_total 有增长

监控可以直接告诉你什么时候开始泄漏。

场景 3:连接池配置过小

你的池最大 10,但流量高峰需要 50。

symptoms:

  • pending 上升
  • timeout 增加
  • 使用率长期超过 90%

这时候应该增加 maximumPoolSize,而不是怀疑数据库。

监控最佳实践

总结下最有效的经验。

必开指标

  • active
  • idle
  • pending
  • timeout_total
  • created_total
  • borrow duration(需要 Java Micrometer 配合)

必开告警

  • active 超过 80%
  • pending > 0 持续 30 秒
  • borrow timeout
  • created_total 曲线异常上升(潜在泄漏)

业务监控增强

也可以加入:

  • SQL 执行时间 histogram
  • 慢查询 TOP N
  • DB CPU 利用率
  • QPS 与连接使用率对比

这样你就能完全定位 DB 性能瓶颈。

总结

Prometheus + Grafana 是监控数据库连接池最稳、最透明的解决方案。

通过本文的完整步骤,你可以做到:

  1. 实时看见连接池状态
  2. 在事故发生前收到告警
  3. 快速定位连接泄漏或慢查询
  4. 清晰判断是否需要扩容数据库或优化 SQL
相关推荐
amao998810 分钟前
数据库原理与技术 - 3-5 SQL查询训练(习题)
数据库·sql
程序员Null的自我修养21 分钟前
全面整理Redis过期删除与内存淘汰策略底层原理机制
数据库·redis
陌路201 小时前
MYSQL索引篇--基础知识
数据库·mysql
酸菜牛肉汤面2 小时前
29、主键使用自增ID还是UUID?
数据库
北极之熊熊2 小时前
海量数据库安装及常用命令
linux·运维·数据库
Macbethad2 小时前
技术方案:基于 TwinCAT 3 的半导体设备气路控制系统设计
java·运维·数据库
玄同7653 小时前
Python 系统编程双雄:sys 与 os 模块深度实践指南
开发语言·数据库·人工智能·windows·笔记·python·microsoft
陈天伟教授3 小时前
数据库技术发展趋势- 04.大数据技术
数据库·人工智能·数据挖掘
山峰哥3 小时前
SQL调优实战指南:从索引设计到高并发场景优化全链路解析
大数据·汇编·数据库·sql·编辑器·区块链
zbguolei3 小时前
上传 Excel 文件进行数据库比对
数据库·excel