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

编程入门 行业动态 更新时间:2024-10-26 14:30:23

聊聊如何利用<a href=https://www.elefans.com/category/jswz/34/1691717.html style=p6spy进行sql监控"/>

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

前言

1、p6spy简介

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

2、实现原理

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

3、相关官方文档

github

官网:.html

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: ${DRIVER_CALSS_NAME:com.p6spy.engine.spy.P6SpyDriver}url: ${DATASOURCE_URL:jdbc:p6spy:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai}username: ${DATASOURCE_USERNAME:root}password: ${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.P6SpyLogger
logMessageFormat=com.github.lybgeek.p6spy.extentsion.CustomP6SpyLogger
#日志输出到控制台
#appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
appender=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=2

4、自定义日志格式【可选】

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.CustomP6SpyLogger

5、自定义日志输出【可选】

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.CustomStdoutLogger

6、测试观察控制台输出

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

总结

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

demo链接

更多推荐

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

本文发布于:2024-02-12 08:37:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686994.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:p6spy   sql

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!