java中慢sql统计需依赖druid连接池,核心是启用statfilter并配置slowsqlmillis阈值、logslowsql=true落盘日志,配合druid监控页面和/actuator/metrics端点实现全链路可观测。

Java 中数据库连接池配置慢 SQL 统计日志,核心是用好 Druid 的 StatFilter 和日志联动机制。HikariCP 等轻量池本身不提供慢 SQL 识别能力,所以实际落地基本依赖 Druid —— 它不是单纯连接池,而是带监控能力的 JDBC 中间件。
启用 StatFilter 并设慢 SQL 阈值
StatFilter 是统计和识别慢 SQL 的基础。必须显式启用,并设定毫秒级阈值:
- 在
application.yml中配置:
spring.datasource.druid.filters=stat
spring.datasource.druid.connection-properties=druid.stat.slowSqlMillis=500;druid.stat.mergeSql=true -
slowSqlMillis=500表示执行超 500ms 的 SQL 被标记为“慢”;可根据业务容忍度调低(如 200ms)或调高(如 1000ms) -
mergeSql=true合并参数化 SQL(如SELECT * FROM user WHERE id = ?),便于聚合分析,避免同结构 SQL 被拆成多条
让慢 SQL 输出到日志文件
Druid 默认只内存记录慢 SQL,重启即丢。要落盘审计,需开启日志输出并匹配日志框架级别:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 加配置项:
spring.datasource.druid.filter.stat.logSlowSql=true - 确保日志框架(如 Logback)中以下 Logger 设为 DEBUG 级:
druid.sql.Statement
druid.sql.DataSource - 这样每条慢 SQL 会以 DEBUG 日志形式打印,含完整 SQL、参数、耗时、堆栈,例如:
[DEBUG] druid.sql.Statement - {conn-10002, pstmt-20003} exec sql : SELECT * FROM order WHERE status = ? and create_time > ? ; time : 682 ms
开放 Druid 监控页面查看实时慢 SQL
除了日志,Druid 内置 Web 页面可直观查看历史慢 SQL 列表,适合快速定位和趋势判断:
- 启用监控 Servlet:
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456 - 启动后访问:
http://localhost:8080/druid/(路径可自定义) - 登录后点击顶部「SQL 监控」→「慢 SQL」标签页,即可看到按耗时倒序排列的列表,含发生时间、参数、执行堆栈等字段
补充:对接外部监控做长期分析
如果需要跨实例聚合、告警或可视化,建议把慢 SQL 指标导出:
- 使用
druid-spring-boot-starter(2.0+ 版本),自动暴露/actuator/metrics/druid.*端点,其中包含druid.pool.slowQueryCount等指标 - 配合 Micrometer + Prometheus,可绘制慢 SQL 出现频次、平均耗时趋势图
- 自定义
DruidDataSourceStatLogger实现类,重写logSlowQuery方法,将慢 SQL 推送到 Kafka、ES 或业务数据库,用于后续审计分析
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










