P6Spy是一个轻量级框架,只需简单配置,就可以无缝地拦截和记录数据库执行sql以及耗时,而无需对现有应用程序进行代码更改。其原理是包装原有的数据源,在sql执行前后做一些功能增强。
执行效果如图
P6Spy提供了3种集成方式:
本节主要针对第2种方式的使用进行讲解。
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
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。
@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个参数的具体含义:
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
启动项目,访问
http://localhost:8080/demo/test,看一下控制台的打印效果:
由于很多的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把我搞懵了
转载源于:http://www.mswzjz.cn/qtweb/news3/375953.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能