写点什么

聊聊如何利用 p6spy 进行 sql 监控

作者:Java-fenn
  • 2022 年 9 月 14 日
    湖南
  • 本文字数:1715 字

    阅读完需:约 6 分钟

聊聊如何利用 p6spy 进行 sql 监控


前言


1、p6spy 简介


P6Spy 是一个框架,无需对现有应用程序进行任何代码更改,即可无缝拦截和记录数据库数据。通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析


2、实现原理


p6spy 将应用的数据源给劫持了,应用操作数据库其实在调用 p6spy 的数据源,p6spy 劫持到需要执行的 sql 或者 hql 之类的语句之后,他自己去调用一个 realDatasource,再去操作数据库


3、相关官方文档


github : https://github.com/p6spy/p6spy


官网:https://p6spy.readthedocs.io/en/latest/index.html


02


p6spy 使用


1、在项目中的 pom 引入相关的 GAV


<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>${p6spy.version}</version></dependency>2、切换项目中的 jdbc 驱动以及数据源


改成如下内容


spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: {DATASOURCE_URL:jdbc:p6spy:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai}username: {DATASOURCE_PWD:123456}3、在 resource 目录下添加 spy.properties


配置如示例下内容


#3.2.1 以上使用 modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory#3.2.1 以下使用或者不配置 #modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

自定义日志打印

#logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLoggerlogMessageFormat=com.github.lybgeek.p6spy.extentsion.CustomP6SpyLogger#日志输出到控制台 #appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

使用日志系统记录 sql

#appender=com.p6spy.engine.spy.appender.Slf4JLoggerappender=com.github.lybgeek.p6spy.extentsion.CustomStdoutLogger

设置 p6spy driver 代理

deregisterdrivers=true

取消 JDBC URL 前缀

useprefix=true

配置记录 Log 例外,可去掉的结果集有 error,info,batch,debug,statement,commit,rollback,result,resultset.

excludecategories=info,debug,result,commit,resultset

日期格式

dateformat=yyyy-MM-dd HH:mm:ss

实际驱动可多个

#driverlist=org.h2.Driver

是否开启慢 SQL 记录

outagedetection=true

慢 SQL 记录标准 2 秒

outagedetectioninterval=24、自定义日志格式【可选】


public class CustomP6SpyLogger implements MessageFormattingStrategy {


/** * Sql日志格式化 * * @param connectionId: 连接ID * @param now: 当前时间 * @param elapsed: 花费时间 * @param category: 类别 * @param prepared: 预编译SQL * @param sql: 最终执行的SQL * @param url: 数据库连接地址 * @return 格式化日志结果 */@Overridepublic String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {    return StringUtils.isNotBlank(sql) ? " 耗时:" + elapsed + " ms " + now +            "\n 执行 SQL:" + sql.replaceAll("[\\s]+", " ") + "\n" : "";}
复制代码


}在 spy.properties 中配置自定义日志格式


logMessageFormat=com.github.lybgeek.p6spy.extentsion.CustomP6SpyLogger5、自定义日志输出【可选】


public class CustomStdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger{


@Overridepublic void logText(String text) {    System.out.println("sql:" + text);}
复制代码


}在 spy.properties 中配置自定义日志输出


appender=com.github.lybgeek.p6spy.extentsion.CustomStdoutLogger6、测试观察控制台输出


sql: 耗时:1 ms 2022-05-10 11:38:34 执行 SQL:SELECT id,username,password,fullname,mobile,email FROM t_user


03


总结


p6spy 可以根据 sql 的执行效率分析 sql 对 sql 进行优化,但因为 p6spy 会对性能有一定影响,因此不适合在正式环境上使用。此外关于 p6spy 更详细的配置可以查看如下链接

用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
聊聊如何利用p6spy进行sql监控_Java_Java-fenn_InfoQ写作社区