前言

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