SpringBoot整合P6Spy实现全链路SQL监控

一、p6spy核心作用
  1. 完整SQL捕获:输出带实际参数的SQL语句,无需手动拼接

  2. 性能分析:精确记录每条SQL执行耗时

  3. 慢查询检测:支持阈值配置自动标记慢SQL(如 >2s)

  4. ORM调试:验证MyBatis等框架生成的SQL

二、集成步骤
  1. 添加依赖(关键依赖):

    复制代码
    <dependency>
        <groupId>p6spy</groupId>
        <artifactId>p6spy</artifactId>
        <version>3.9.1</version>
    </dependency>
    <!-- MyBatis Plus需额外添加 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-p6spy</artifactId>
    </dependency>
  2. 配置数据源(关键改动):

    复制代码
    spring:
      datasource:
        driver-class-name: com.p6spy.engine.spy.P6SpyDriver # 替换驱动
        url: jdbc:p6spy:mysql://localhost:3306/db # URL添加p6spy前缀
  3. 创建日志格式化类(可选增强):

    复制代码
    public class CustomP6SpyLogger implements MessageFormattingStrategy {
        @Override
        public String formatMessage(...) {
            // 示例:添加ANSI颜色/格式化日期参数
            return String.format("\u001B[33m%s | 耗时:%dms | SQL:\u001B[32m%s\u001B[0m", 
                                 now, elapsed, formattedSql);
        }
    }
  4. 配置spy.properties(核心配置):

    复制代码
    # 日志输出方式
    appender=com.p6spy.engine.spy.appender.StdoutLogger
    # 自定义格式化类
    logMessageFormat=com.example.CustomP6SpyLogger
    # 慢SQL检测(2秒阈值)
    outagedetection=true
    outagedetectioninterval=2
    # 排除无关日志
    excludecategories=info,debug,resultset
三、注意事项
  1. 版本兼容:MySQL 8.x需使用p6spy 3.9.x

  2. 性能损耗 :增加约5%-10%开销,生产环境建议:

    • 关闭常规监控

    • 仅启用慢查询检测

  3. 文件位置spy.properties必须放在src/main/resources

  4. 日志优化 :通过excludecategories过滤非SQL日志

四、效果演示

控制台输出示例:

复制代码
2023-05-01 12:30:45 | 耗时: 148ms | SQL: SELECT * FROM user WHERE create_time > '2023-01-01 00:00:00'

可直接拷贝SQL到数据库客户端执行

五、总结

p6spy解决了开发中的两大痛点:

  1. 直观获取完整SQL:摆脱参数占位符拼接

  2. 精准定位慢查询:通过耗时监控优化数据库性能 建议在开发/测试环境启用,生产环境按需使用慢查询监控功能。

相关推荐
大厂码农老A5 分钟前
P10老板一句‘搞不定就P0’,15分钟我用Arthas捞回1000万资损
java·前端·后端
Pomelo_刘金14 分钟前
常见的幂等方案
后端
tonydf19 分钟前
Blazor Server项目里,集成一个富文本编辑器
后端
文心快码BaiduComate27 分钟前
文心快码已接入GLM-4.6模型
前端·后端·设计模式
RoyLin38 分钟前
C++ 原生扩展、node-gyp 与 CMake.js
前端·后端·node.js
五颜六色的池43 分钟前
my sql 常用函数及语句的执行顺序
数据库·sql
Fency咖啡1 小时前
Spring Boot 3.x 开发 Starter 快速上手体验,通过实践理解自动装配原理
java·spring boot·后端
元Y亨H1 小时前
SQL Join 中函数使用对性能的影响与优化方法
sql
南方者1 小时前
【JAVA】【BUG】Java 开发中常见问题的具体示例,结合代码片段说明问题场景及原因
java·后端·debug
寻月隐君2 小时前
Rust 泛型编程基石:AsRef 和 AsMut 的核心作用与实战应用
后端·github