本文主要是介绍Springboot中分析SQL性能的两种方式详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环...
SQL性能分析的两种方式:
功能介绍
- 记录 SQL 执行时间,超过阈值会进行警告
- 打印完整的 SQL 语句,便于调试和优化
- 适用于开发和测试环境,生产环境建议关闭
实现方式:
方式一:使用 MyBATis-Plus 性能分析插件
首先需要在MyBatis-Plus
配置类中配置PerformanceInterceptor
插件:
@Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 添加分页拦截器(如果使用分页) interceptor.addInnerInterceptor(new PagiphpnationInnerInterceptor(DbType.mysql)); // 添加性能分析拦截器 PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); performanceInterceptor.setMaxTandroidime(500); // SQL 最大执行时间(毫秒),超过自动警告 performanceInterceptor.setFormat(true); // 是否格式化 SQL 语句 interceptor.addInnerInterceptor(performanceInterceptor); return interceptor; } }
配置项说明:
配置项 | 说明 | 示例 |
---|---|---|
setMaxTime(long maxTime) | 设置 SQL 执行的最大时长(单位:ms),超过时间将抛出异常,默认 -1(不限制) | performanceInterceptor.setMaxTime(500); // 超过 500ms 警告 |
setFormat(boolean format) | 是否格式化 SQL,默认 false ,开启后会美化 SQL 输出 | performanceInterceptor.setFormat(true); |
日志输出:
当查询执行时间超过 maxTime
限制时,控制台会输出:
[SQL] ==> Preparing: SELECT * FROM orders WHERE status = ?
[SQL] ==> Parameters: 1(Integer)
[SQL] <== Total Time: 850 ms (超过最大时间 500ms,可能存在性能问题)
由于MyBatis-Plus 3.4.0
以后已经将上述插件弃用,所以如果你使用高版本的MyBatis-Plus
,推荐使用方式二.
方式二:使用p6spy
框架 效果图:
实现步骤:
1.引入pom
依赖:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency>
2.首先在 springboot
配置类中加入配置:
- 把原来的
JDBC Driver
替换为com.p6spy.engine.spy.P6SpyDriver
. - 在原来
url
的jdbc
:后面添加p6spy
:,比如jdbc:p6spy:mysql://127.0.0.1:3306/databse
- 添加
p6spy
的配置文件spy.properties
.
配置文件内容如下:
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory # 自定义日志打印 logMessageFormat=warren.reggie.common.P6SpyLogger #logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat #customLogMessageFormat=%(currentTime) | SQL耗时: %(executionTime) ms | 连接信息: %(category)-%(connectionId) | 执行语句: %(sql)# 使用控制台记录sql appender=com.p6spy.engine.spy.appender.StdoutLogger ## 配置记录Log例外 excludecategories=info,debug,result,batc,resultset # 设置使用p6spy driver来做代理 deregisterdrivers=true # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss # 实际驱动 driverlist=com.mysql.jdbc.Driver # 是否开启慢SQL记录 outagedetection=true # 慢SQL记录标准秒 outagedetectioninterval=2
3.自定义日志输出格式:
首先创建P6SpyLogger
类:
package warren.reggie.common; import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import Java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * 自定义 P6Spy SQL 日志格式(带颜色) * author: Warren */public class P6SpyLogger implements MessageFormattingStrategy { // ANSI 颜色代码 private static final String RESET = "\u001B[0m"; // 重置颜色 private static final String RED = "\u001B[31m"; // 红色(高亮错误) private static final String GREEN = "\u001B[32m"; // 绿色(SQL 语句) private static final String YELLOW = "\u001B[33m";// 黄色(执行时间) private static final String BLUE = "\u001B[34m"; // 蓝色(分类) private static final String CYAN = "\u001B[36m"; // 青色(连接 ID) /** * 自定义 SQL 日志格式(带颜色) * * @param connectionId 连接 ID编程 * @param now 当前时间(P6Spy 传递的) * @param elapsed SQL 执行时间(ms) * @param category SQL 类型(如 statement、commit、rollback) * @param prepared 预编译 SQL(带 ? 占位符) * @param sql 真实 SQL 语句(占位符替换后的) * @param url 数据库连接 URL * @return 格式化后的日志字符串 */ @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { // 过滤空 http://www.chinasem.cnSQL if (sql == null || sql.trim().isEmpty()) { return ""; } // 格式化当前时间 String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 构造带颜色的日志输出 return String.format( "%s[%s]%s | %s耗时: %d ms%s | %s连接: %d%s | %s分类: %s%s\n%s执行 SQL: %s%s;\n", CYAN, currentTime, RESET, // 时间(青色) YELLOW, elapsed, RESET, // 执行时间(黄色) BLUE, connectionId, RESET, // 连接 ID(蓝色) RED, category, RESET, // 分类(红色) GREEN, sql.trim(), RESET // SQL 语句(绿色) ); } }
然后将配置文件中的格式化器属性改为自己的类 :
# 自定义日志打印 logMessageFormat=warren.reggie.common.P6SpyLogger
到此这篇关于Spri编程ngboot中分析SQL性能的两种方式详解的文章就介绍到这了,更多相关Springboot 分析sql性能内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于Springboot中分析SQL性能的两种方式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!