Springboot中分析SQL性能的两种方式详解

2025-02-21 17:50

本文主要是介绍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框架 效果图:

Springboot中分析SQL性能的两种方式详解

实现步骤:

1.引入pom依赖:

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

2.首先在 springboot配置类中加入配置:

  • 把原来的JDBC Driver替换为com.p6spy.engine.spy.P6SpyDriver.
  • 在原来urljdbc:后面添加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性能的两种方式详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153487

相关文章

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安