HikariCP监控核心是启用register-mbeans并结合JMX或Micrometer:需配置spring.datasource.hikari.register-mbeans=true,通过com.zaxxer.hikari:type=Pool获取active/idle连接数等指标,或集成Micrometer自动暴露hikaricp.connections.*系列指标供Prometheus采集。

Java 中监控数据库连接池的实时运行状态,核心是结合连接池自身的指标暴露能力与标准监控机制(如 JMX、Metrics 或 Web 界面),不依赖外部 APM 工具也能快速落地。
启用连接池的内置监控支持
不同连接池开启方式不同,但都需主动配置:
-
HikariCP:设置
spring.datasource.hikari.register-mbeans=true(Spring Boot)或config.setRegisterMBeans(true)(原生),之后可通过 JMX 访问com.zaxxer.hikari:type=Pool下的 MBean 属性,如getActiveConnections()、getIdleConnections()、getThreadsAwaitingConnection() -
Druid:默认开启 JMX,同时提供内置监控页面。在 Spring 中配置
spring.datasource.druid.stat-view-servlet.enabled=true,启动后访问/druid/index.html即可查看数据源统计、SQL 监控、慢 SQL、Session 列表等 -
Tomcat JDBC Pool:需在
conf/server.xml的<Resource>中添加factory="org.apache.tomcat.jdbc.pool.DataSourceFactory",并启用 JMX 监听器:<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10099" rmiServerPortPlatform="10098"/>
通过代码定时采集关键指标
适合集成到健康检查或自定义监控端点中:
- HikariCP 可通过
HikariPoolMXBean代理获取实时值,注意首次调用前必须已有至少一个连接被创建,否则 JMX 对象未注册会抛UndeclaredThrowableException - Druid 提供
DruidDataSource.getStat()方法,返回DruidStatManager实例,可直接读取getActiveCount()、getPoolingCount()、getWaitThreadCount()等 - 所有连接池的活跃数、空闲数、等待线程数都是瞬时快照,不可用于条件判断或自动扩缩容逻辑,仅作观测参考
对接统一监控体系(如 Micrometer + Prometheus)
将连接池指标纳入系统级可观测性链路:
立即学习“Java免费学习笔记(深入)”;
- HikariCP 支持
MetricRegistry(Dropwizard Metrics)或原生 Micrometer:引入micrometer-registry-prometheus,Spring Boot 2.0+ 会自动将 Hikari 指标注册为hikaricp.connections.*系列(如hikaricp.connections.active、hikaricp.connections.idle) - Druid 可通过
DruidStatConfigUtil.toStatFilter()注册 StatFilter,再配合DruidStatManager将指标导出为 Micrometer Gauge - 建议重点采集:活跃连接数占比(active / max)、平均获取连接耗时、连接等待超时次数、连接泄露告警(如
removeAbandonedOnBorrow触发频次)
警惕常见盲区和权限问题
监控能跑通 ≠ 数据可信,需验证底层可行性:
- JMX 远程连接需确认 JVM 启动参数已开放,如
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999,并注意防火墙和认证配置 - Oracle 等数据库的会话级监控(如查
v_$session)要求应用账号有SELECT_CATALOG_ROLE或显式授权GRANT SELECT ON v_$session TO app_user,否则报 ORA-00942 - v$ 视图查询必须用
v_$session写法(带下划线),JDBC 驱动不识别v$session;且字段可能为 NULL,需做空值校验


















