项目拓展-简易SQL监控,P6SPY拦截所有jdbc连接并打印执行SQL
介绍一下P6spy驱动
p6spy 是一款开源的数据库监控框架,主要用于 拦截和记录应用程序与数据库之间的所有交互(如 SQL 语句、参数、执行时间等)
它通过包装现有的 JDBC 驱动(如 MySQL JDBC 驱动),在不修改业务代码的情况下,实现对数据库操作的透明监控和分析。
p6spy 和普通 MySQL 驱动的区别
特性 | 普通 MySQL 驱动(如 ) | p6spy |
核心功能 | 实现数据库通信协议,执行 SQL 并返回结果。 | 拦截和增强现有 JDBC 驱动的功能,记录 SQL 操作。 |
日志能力 | 仅支持基础日志(需手动配置,功能有限)。 | 提供详细的 SQL 日志(含参数、执行时间、调用栈)。 |
代码侵入性 | 无侵入,直接使用原生驱动。 | 无侵入,通过配置替换原生驱动为 p6spy 驱动。 |
性能开销 | 低,仅处理数据库通信。 | 有一定开销(额外拦截和日志记录)。 |
适用场景 | 生产环境直接操作数据库。 | 开发/测试环境调试、性能优化、审计。 |
p6spy 的核心价值
透明监控
无需修改代码,通过配置即可捕获所有 SQL 操作
记录完整的 SQL 语句(含动态参数)、执行时间、连接信息等
调试与优化
快速定位慢查询(通过执行时间分析)。
验证 SQL 参数是否正确绑定(避免 SQL 注入或逻辑错误)
日志增强
支持格式化输出(如 JSON、SQL 美化)
可集成日志框架(如 Log4j、SLF4J)
P6spy使用快速入门
依赖
<dependency><groupId>com.github.klboke</groupId><artifactId>p6spy-spring-boot-starter</artifactId><version>1.0</version>
</dependency>
配置文件
application.yml
指定依赖:com.p6spy.engine.spy.P6SpyDriver
spring:application:name: Kira-Test # 注意:YAML中使用冒号(:)而非等号(=)datasource:driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jdbc:p6spy:mysql://127.0.0.1/mytestusername: rootpassword: 123456hikari:minimum-idle: 5 # 最小空闲连接数maximum-pool-size: 20 # 最大连接数idle-timeout: 60000 # 空闲连接超时时间(ms)max-lifetime: 1800000 # 连接最大存活时间(ms)connection-timeout: 20000 # 连接超时时间(ms)validation-timeout: 5000 # 验证查询超时时间(ms)leak-detection-threshold: 2000 # 连接泄漏检测阈值(ms)logging:level:com.p6spy: DEBUGp6spy: DEBUG
spy.properties
p6spy的配置文件
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)| SQL耗时:%(executionTime) ms | 连接%(connectionId) | 执行的SQL语句:%(category) %(sql)appender=com.p6spy.engine.spy.appender.StdoutLoggerexcludecategories=info,debug,result,batc,resultsetderegisterdrivers=truedateformat=yyyy-MM-dd HH:mm:ssdriverlist=com.p6spy.engine.spy.P6SpyDriveroutagedetection=trueoutagedetectioninterval=2
控制台输出的sql细节
2025-04-11 11:23:44| SQL耗时:6 ms | 连接0 | 执行的SQL语句:statement insert into t_pha_trade (json_test) VALUES ('[{"installAdsNum":3,"retentionDuration":"30","retentionStrategy":"0.6,0.52,0.5"},{"installAdsNum":5,"retentionDuration":"45","retentionStrategy":"0.7,0.6,0.55,0.5"},{"installAdsNum":2,"retentionDuration":"20","retentionStrategy":"0.5,0.45"}]')