P6Spy是当准一个轻量级框架,只需简单配置,备用把搞就可以无缝地拦截和记录数据库执行sql以及耗时,优雅而无需对现有应用程序进行代码更改。解耦其原理是时连包装原有的数据源,在sql执行前后做一些功能增强。续两 执行效果如图 P6Spy提供了3种集成方式: 本节主要针对第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.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 需要注意配置参数logMessageFormat,这里需要指定一个类,这个类实现MessageFormattingStrategy即可自由打印我们的sql。 步骤四,新建一个类实现MessageFormattingStrategy,并重写formatMessage方法。@Slf4j public 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个参数的具体含义: now:当前时间,毫秒值。 elapsed:sql执行的耗时。需要注意的是云南idc服务商这里的耗时指的是从发送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 ResponseEntitytest() { 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(); } 启动项目,访问 由于很多的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通过对数据源的包装,进而实现了一系列的功能增强,让我们可以方便的打印sql执行情况。但是相应的,如果在生产环境开启p6spy的打印功能,对性能还是由一定的影响的。 建议大家在测试环境开启此功能,对跟踪、修复bug都很有帮助。简介
集成方式
如何使用
效果
与Mybatis Plus的网站模板集成
最后