Java数据库操作性能监控核心靠三类手段:连接池内置指标(如HikariCP通过JMX或Micrometer暴露Active/IdleConnections、获取耗时等)、SQL执行埋点(MyBatis拦截器统计耗时、阈值告警、安全日志)、APM工具集成(SkyWalking自动采集调用链、SQL、参数及错误),并需结合慢SQL归档分析与业务指标对齐。

Java 中数据库操作性能监控主要靠三类手段:连接池内置指标、SQL 执行埋点、以及 APM 工具集成。核心是捕获耗时、慢 SQL、连接等待、执行异常等关键信号,而不是只看“有没有报错”。
用连接池自带监控(如 HikariCP)
HikariCP 提供了轻量但实用的运行时指标,无需额外依赖:
- 启用 JMX:启动时加 -Dcom.sun.management.jmxremote,Hikari 会自动注册 MBean,可通过 JConsole 查看
ActiveConnections、IdleConnections、ConnectionTimeouts等; - 代码中调用
getHikariPoolMXBean()获取实时数据,比如每 30 秒打印一次平均获取连接耗时和最大等待时间; - 注意配置
metricRegistry(需引入 Micrometer)可对接 Prometheus,把hikaricp.connections.acquire这类指标暴露出去。
对 SQL 执行做细粒度埋点
在 DAO 层或 MyBatis 拦截器中统计每次查询/更新的耗时与结果:
- MyBatis 可写
Interceptor,在query和update方法前后记录开始/结束时间,提取 SQL、参数、影响行数; - 对耗时超过阈值(如 200ms)的 SQL 自动打 warn 日志,并附上执行堆栈,方便定位是哪次调用拖慢了接口;
- 避免在日志里直接拼接参数(防 SQL 注入和日志爆炸),可用占位符 + 参数长度代替,例如
"SELECT * FROM user WHERE id = ? (len=16)"。
接入 APM 工具(如 SkyWalking / Pinpoint)
这类工具能自动识别 JDBC 调用链,还原完整上下文:
立即学习“Java免费学习笔记(深入)”;
- 添加 agent 启动参数(如 SkyWalking 的
-javaagent:/path/skywalking-agent.jar),无需改代码即可采集 SQL 语句、执行时间、绑定参数(可选开启)、错误堆栈; - 在 UI 上按服务+接口下钻,看到某次 HTTP 请求触发了哪些 SQL、各自耗时多少、是否命中索引(部分插件支持 explain 分析);
- 设置告警规则,例如“单条 SQL 平均耗时 > 500ms 且连续 5 分钟”就发钉钉通知。
补充:慢 SQL 主动发现与归档
光靠实时监控不够,还需定期分析历史行为:
- 开启 MySQL 的
slow_query_log,结合 pt-query-digest 工具分析日志,输出最耗时、最频繁的 SQL 排行榜; - 在应用侧加一个定时任务,每天扫描当日埋点中 Top 10 慢 SQL,写入内部看板或企业微信机器人;
- 对反复出现的慢 SQL,自动关联其调用来源(如 Controller 方法名 + URL),推动业务方优化或加缓存。
不复杂但容易忽略的是:监控必须和业务指标对齐。比如订单创建接口 P99 耗时升高,要能立刻查到是不是某张表的 INSERT 变慢了,而不是在一堆数据库指标里手动筛选。所以埋点设计要带业务上下文,APM 链路要打通 Web 层到 DAO 层。



















