简介

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。
  p6spy  p6spy  3.9.1
步骤二,修改数据源的配置。
spring:  datasource:    //此处的URL增加了p6spy    url: jdbc:p6spy:mysql://127.0.0.1:3306/dbName    username: username    password: pwd123456    //将普通的MySQL驱动替换为P6SpyDriver    driver-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.P6SpyMessageFormattingStrategyappender=com.p6spy.engine.spy.appender.Slf4JLoggerderegisterdrivers=trueuseprefix=trueexcludecategories=info,debug,result,resultsetdateformat=yyyy-MM-dd HH:mm:ssoutagedetection=trueoutagedetectioninterval=2filter=trueexclude=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方法。
@Slf4jpublic class P6SpyMessageFormattingStrategy implements MessageFormattingStrategy {    @Override    public 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个参数的具体含义:connectionId:当前connection的id。

now:当前时间,毫秒值。

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

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

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

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

url:当前的数据库连接。

效果

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

@RestController@RequestMapping(value = "/demo")public class DemoController {    @Resource    private 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的打印功能,对性能还是由一定的影响的。

建议大家在测试环境开启此功能,对跟踪、修复bug都很有帮助。

推荐内容

  • 当我准备用SpringEvent优雅的解耦时,连续两个Bug把我搞懵了

  • 我们一起聊聊分布式架构中的可观测性,看你了解几分?

  • 当前速看:小米13和二手iPhone 13的价格差不多 雷总我很难选啊

  • 今日讯!OPPO Find N2 Flip亮相:副屏太惊艳

  • 天天滚动:李诞入手小米13和13 Pro:大玩谐音梗

  • 天天即时看!12799元高价挡不住!三星Galaxy Z Flip4限量版宣告全面售罄

  • 雀巢母婴专业服务再升级,聚焦育儿共同压力

  • 天天热资讯!雷军分享小米13/MIUI 14内置壁纸原图:大批iPhone用户感谢

  • 最资讯丨不用耳机也有立体听感!moto X40新增空间音频功能

  • 企业技术采购:保姆级指南

  • 分布式、储能、微电网——数据中心新能源应用“三板斧”

  • 2022 年主要数据中心可持续发展趋势

  • 购置税将“厚惠”无期,瑞虎5x PLUS 和长安CS35 PLUS该选谁?

  • 即时焦点:全球首发的第二代骁龙8!vivo X90 Pro+开箱图赏

  • 当前热议!同价位唯一三星E6 2K直屏!iQOO 11全渠道首销15秒破亿

  • 快资讯:使用13个月还可5折回收!小米13推出“保值换新”服务

  • 每日快播:小米13发布后李杰预热一加11:值得期待 有点东西

  • 焦点信息:小米13/iPhone 14同款IP68级!moto X40防水实测:潜入水下还能用

  • 购置税全免仅剩十多天!遇到瑞虎7 PLUS或超能版,就毫不犹豫购了吧

  • 怎样搞好商业服务软文推广? 写商业软文实际效果如何?

三好网