Spring项目中自动打印执行SQL和耗时,这款神级插件你值得拥有
创始人
2024-05-11 06:20:16
0

这里写自定义目录标题

  • 参考
  • 简介
  • 集成方式
  • 如何使用
    • 步骤一,引入P6Spy。
    • 步骤二,修改数据源的配置。
    • 步骤三,新建spy.properties文件,放在resources目录下。
    • 步骤四,新建一个类实现MessageFormattingStrategy,并重写formatMessage方法。
  • 效果
  • 与Mybatis Plus的集成
  • 最后

参考

Spring项目中自动打印执行SQL和耗时,这款神级插件你值得拥有

简介

P6Spy是一个轻量级框架,只需简单配置,就可以无缝地拦截和记录数据库执行sql以及耗时,而无需对现有应用程序进行代码更改。其原理是包装原有的数据源,在sql执行前后做一些功能增强。
在这里插入图片描述

集成方式

P6Spy提供了3种集成方式:

  • Datasource way:如果我们的项目中使用了自定义的Datasource,可以使用P6DataSource对原有的数据源进行包装,只需将自定义的DataSource传入P6DataSource的构造函数中即可,这也是使用P6Spy最简单的一种方式。
  • Connection URL way:由于我们一般都是用框架提供的数据源,所以P6Spy也提供了对链接进行包装的功能。只要在配置数据源时,稍微修改配置的属性,即可使用P6Spy的功能。
  • Spring Boot autoconfiguration:随着Spring boot的流行,P6Spy还提供了基于Springboot的自动配置。

如何使用

本节主要针对第2种方式的使用进行讲解。

步骤一,引入P6Spy。

p6spyp6spy3.9.1

步骤二,修改数据源的配置。

spring:datasource://此处的URL增加了p6spyurl: jdbc:p6spy:mysql://127.0.0.1:3306/dbNameusername: usernamepassword: pwd123456//将普通的MySQL驱动替换为P6SpyDriverdriver-class-name: com.p6spy.engine.spy.P6SpyDriver

步骤三,新建spy.properties文件,放在resources目录下。

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
//注意此行配置
logMessageFormat=com.shishan.demo2023.bean.P6SpyMessageFormattingStrategy
appender=com.p6spy.engine.spy.appender.Slf4JLogger
deregisterdrivers=true
useprefix=true
excludecategories=info,debug,result,resultset
dateformat=yyyy-MM-dd HH:mm:ss
outagedetection=true
outagedetectioninterval=2
filter=true
exclude=QRTZ_JOB_DETAILS,QRTZ_TRIGGERS,QRTZ_CRON_TRIGGERS,QRTZ_LOCKS,QRTZ_FIRED_TRIGGERS,QRTZ_PAUSED_TRIGGER_GRPS,QRTZ_SCHEDULER_STATE

需要注意配置参数logMessageFormat,这里需要指定一个类,这个类实现MessageFormattingStrategy即可自由打印我们的sql。

步骤四,新建一个类实现MessageFormattingStrategy,并重写formatMessage方法。

@Slf4j
public class P6SpyMessageFormattingStrategy implements MessageFormattingStrategy {@Overridepublic String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {//执行时间大于1000ms时,打印慢sql  if (elapsed > 1000) {log.warn("slow sql,耗时:{}ms,sql:{}", elapsed, sql.replaceAll("[\\s]+", " "));}return StrUtil.format("耗时:{}ms,Sql:{}",elapsed,category.equals("commit") || category.equals("rollback") ? category :sql.replaceAll("[\\s]+", " "));}
}

formatMessage方法提供了7个参数,这7个参数大家可以自由组合,其中常用的参数有elapsed和sql。

简单介绍一下这7个参数的具体含义:
1,connectionId:当前connection的id。

2,now:当前时间,毫秒值。

3,elapsed:sql执行的耗时。需要注意的是这里的耗时指的是从发送sql到服务器截止到收到服务器响应结果的总耗时,而不是sql本身在服务器的执行时间。

4,category:操作的类型,比如查询,更新,commit,rollback等。

5,prepared:编译后的sql,不打印具体的参数。

6,sql:具体的执行sql,参数占位符会被真正的参数值替换。

7,url:当前的数据库连接。

效果

经过以上4个步骤,P6Spy就可以帮助我们自动打印执行的sql了。我们新建一个controller看看具体的效果。

@RestController
@RequestMapping(value = "/demo")
public class DemoController {@Resourceprivate UserRepository userRepository;@RequestMapping(value = "/test")public ResponseEntity test() {User user = new User();user.setName("张三");user.setPwd("123");User save = this.userRepository.save(user);System.out.println(JSON.toJSONString(save));Iterable all = this.userRepository.findAll();all.forEach(value -> System.out.println(JSON.toJSONString(value)));return ResponseEntity.ok().build();}
}
 

启动项目,访问
http://localhost:8080/demo/test,看一下控制台的打印效果:
在这里插入图片描述

与Mybatis Plus的集成

由于很多的Spring项目也使用了Mybatis Plus,所以MP也提供了对P6Spy的支持。使用方式也很简单,只需对步骤二稍微做一点修改即可。

spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db
username: username
password: pwd123456
driver-class-name: com.mysql.cj.jdbc.Driver
//增加一个配置即可使用p6spy的功能
p6spy:true

最后

P6Spy通过对数据源的包装,进而实现了一系列的功能增强,让我们可以方便的打印sql执行情况。但是相应的,如果在生产环境开启p6spy的打印功能,对性能还是由一定的影响的。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...