前言
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
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.DruidDataSource
driverClassName: ${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 格式化日志后果
*/
@Override
public 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{
@Override
public 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 更具体的配置能够查看如下链接
https://p6spy.readthedocs.io/en/latest/configandusage.html
demo 链接
https://github.com/lyb-geek/springboot-learning/tree/master/springboot-p6spy