RuoYi-Cloud-Plus SQL监控:p6spy配置详解
前言:为什么需要SQL监控?
在日常开发中,SQL性能问题往往是系统瓶颈的主要来源。你是否遇到过这样的困扰:
- SQL执行缓慢,但不知道具体哪条语句耗时
- 生产环境出现性能问题,却无法快速定位SQL瓶颈
- 复杂的多表关联查询,难以分析执行计划和参数绑定
- 需要监控SQL执行情况,但不想修改业务代码
RuoYi-Cloud-Plus集成的p6spy正是解决这些痛点的利器!本文将详细介绍如何在RuoYi-Cloud-Plus中配置和使用p6spy进行SQL监控。
p6spy简介
p6spy是一个开源的JDBC驱动代理框架,它能够拦截和记录所有通过JDBC执行的SQL语句,包括:
- 完整的SQL语句(含参数值)
- 执行时间统计
- 连接信息
- 执行结果
核心优势
| 特性 | 描述 | 优势 |
|---|---|---|
| 无侵入性 | 只需修改JDBC URL,无需改动业务代码 | 部署简单,风险低 |
| 完整SQL输出 | 显示真实的参数值而非占位符 | 便于调试和分析 |
| 性能监控 | 记录每个SQL的执行时间 | 快速定位性能瓶颈 |
| 多格式输出 | 支持控制台、文件、Slf4J等多种输出方式 | 灵活适配各种环境 |
RuoYi-Cloud-Plus中的p6spy配置
1. 依赖配置
在项目根目录的pom.xml中已经集成了p6spy依赖:
<properties>
<p6spy.version>3.9.1</p6spy.version>
</properties>
<dependencies>
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>${p6spy.version}</version>
</dependency>
</dependencies>
2. 数据源配置
在Nacos配置中心的datasource.yml中启用p6spy:
spring:
datasource:
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
3. p6spy配置文件
项目在ruoyi-common/ruoyi-common-mybatis/src/main/resources/目录下提供了spy.properties配置文件:
# p6spy 性能分析插件配置文件
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
配置详解
核心配置项说明
1. modulelist 模块配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
- MybatisPlusLogFactory: MyBatis-Plus专用的日志工厂,提供更好的格式化和MyBatis-Plus特性支持
- P6OutageFactory: 超时检测模块,可以检测SQL执行超时情况
2. logMessageFormat 日志格式
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
使用MyBatis-Plus优化的日志格式,输出信息更加清晰易读。
3. appender 输出方式
# 控制台输出(开发环境推荐)
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 日志文件输出(生产环境推荐)
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 文件输出(自定义文件路径)
#appender=com.p6spy.engine.spy.appender.FileLogger
#logfile=spy.log
实战配置示例
开发环境配置(推荐)
# 开发环境 - 控制台输出
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 是否显示连接信息
executionThreshold=10
生产环境配置
# 生产环境 - 文件输出
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 只记录执行时间超过100ms的SQL
executionThreshold=100
filter=true
高级监控配置
# 高级监控配置
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 超时检测配置(单位:秒)
outagedetection=true
outagedetectioninterval=30
# 执行时间阈值(单位:毫秒)
executionThreshold=50
# 是否过滤空语句
filter=true
SQL监控输出示例
启用p6spy后,控制台将输出格式化的SQL信息:
-- 示例输出格式:
Consume Time:15 ms 2023-01-01 10:00:00
Execute SQL:SELECT * FROM sys_user WHERE user_id = 1 AND status = 1
-- 包含执行计划的详细输出:
Consume Time:32 ms 2023-01-01 10:00:01
Execute SQL:INSERT INTO sys_log (module, action, user_id) VALUES ('用户管理', '新增用户', 1001)
Affected Lines:1
性能优化建议
1. 生产环境注意事项
2. 监控策略表
| 环境 | 推荐配置 | 执行阈值 | 输出方式 | 说明 |
|---|---|---|---|---|
| 开发环境 | 全量监控 | 0ms | 控制台 | 便于调试,实时查看SQL |
| 测试环境 | 选择性监控 | 50ms | 文件 | 记录性能问题SQL |
| 预生产环境 | 性能监控 | 100ms | Slf4J | 监控潜在性能问题 |
| 生产环境 | 关键监控 | 200ms | 文件 | 仅记录慢查询,避免性能影响 |
3. 动态开关配置
在Nacos中可以通过环境变量动态控制p6spy:
spring:
datasource:
dynamic:
p6spy: ${P6SPY_ENABLED:false}
这样可以通过环境变量P6SPY_ENABLED来动态启用或禁用p6spy监控。
常见问题排查
1. p6spy未生效
检查步骤:
- 确认
datasource.yml中p6spy: true - 确认
spy.properties文件存在且配置正确 - 检查JDBC URL是否包含
p6spy驱动
2. 性能影响过大
解决方案:
- 增加
executionThreshold阈值,只记录慢SQL - 生产环境考虑禁用或使用采样监控
3. 日志输出过多
调整策略:
- 使用
filter=true过滤空语句 - 调整日志级别为WARN或ERROR
总结
RuoYi-Cloud-Plus通过p6spy提供了强大的SQL监控能力,帮助开发者:
- 快速定位性能瓶颈 - 精确到毫秒的SQL执行时间监控
- 完整SQL调试 - 显示真实的参数值,便于问题复现
- 无侵入集成 - 只需配置开关,无需修改业务代码
- 多环境适配 - 支持开发、测试、生产等不同环境的监控策略
通过合理的配置,p6spy可以成为微服务开发中不可或缺的SQL监控工具,大幅提升系统性能和开发调试效率。
提示:生产环境使用时请谨慎评估性能影响,建议通过阈值过滤只记录慢查询SQL。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



