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

简介

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

执行效果如图

集成方式

P6Spy提供了3种集成方式:

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

如何使用

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

步骤一,引入P6Spy。

<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>

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

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-ddHH: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
publicclassP6SpyMessageFormattingStrategyimplementsMessageFormattingStrategy {

@Override
publicStringformatMessage(intconnectionId, Stringnow, longelapsed,
Stringcategory, Stringprepared, Stringsql, Stringurl) {
//执行时间大于1000ms时,打印慢sql
if (elapsed>1000) {
log.warn("slow sql,耗时:{}ms,sql:{}", elapsed, sql.replaceAll("[\\s]+", " "));
}
returnStrUtil.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")
publicclassDemoController {

@Resource
privateUserRepositoryuserRepository;

@RequestMapping(value="/test")
publicResponseEntity<Object>test() {
Useruser=newUser();
user.setName("张三");
user.setPwd("123");
Usersave=this.userRepository.save(user);
System.out.println(JSON.toJSONString(save));

Iterable<User>all=this.userRepository.findAll();
all.forEach(value->System.out.println(JSON.toJSONString(value)));
returnResponseEntity.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都很有帮助。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/279892.html<

(0)
管理的头像管理
上一篇2025-05-12 06:43
下一篇 2025-05-12 06:44

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注