麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
843
2023-04-22
当我准备用SpringEvent优雅的解耦时,连续两个Bug把我搞懵了
简介
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。
步骤二,修改数据源的配置。
步骤三,新建spy.properties文件,放在resources目录下。
需要注意配置参数logMessageFormat,这里需要指定一个类,这个类实现MessageFormattingStrategy即可自由打印我们的sql。
步骤四,新建一个类实现MessageFormattingStrategy,并重写formatMessage方法。
formatMessage方法提供了7个参数,这7个参数大家可以自由组合,其中常用的参数有elapsed和sql。
简单介绍一下这7个参数的具体含义:connectionId:当前connection的id。
now:当前时间,毫秒值。
elapsed:sql执行的耗时。需要注意的是这里的耗时指的是从发送sql到服务器截止到收到服务器响应结果的总耗时,而不是sql本身在服务器的执行时间。
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
与Mybatis Plus的集成
由于很多的Spring项目也使用了Mybatis Plus,所以MP也提供了对P6Spy的支持。使用方式也很简单,只需对步骤二稍微做一点修改即可。
最后
P6Spy通过对数据源的包装,进而实现了一系列的功能增强,让我们可以方便的打印sql执行情况。但是相应的,如果在生产环境开启p6spy的打印功能,对性能还是由一定的影响的。
建议大家在测试环境开启此功能,对跟踪、修复bug都很有帮助。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。