最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot中分析SQL性能的兩種方式詳解

 更新時間:2025年02月21日 14:29:15   作者:Warren98  
文章介紹了SQL性能分析的兩種方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置簡單,適用于開發(fā)和測試環(huán)境,但高版本已棄用;p6spy框架功能更強大,可以自定義日志輸出格式,但在生產環(huán)境中使用需謹慎,感興趣的朋友一起看看吧

SQL性能分析的兩種方式:

功能介紹

  • 記錄 SQL 執(zhí)行時間,超過閾值會進行警告
  • 打印完整的 SQL 語句,便于調試和優(yōu)化
  • 適用于開發(fā)和測試環(huán)境,生產環(huán)境建議關閉

實現(xiàn)方式:

方式一:使用 MyBatis-Plus 性能分析插件

首先需要在MyBatis-Plus配置類中配置PerformanceInterceptor插件:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分頁攔截器(如果使用分頁)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 添加性能分析攔截器
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(500); // SQL 最大執(zhí)行時間(毫秒),超過自動警告
        performanceInterceptor.setFormat(true); // 是否格式化 SQL 語句
        interceptor.addInnerInterceptor(performanceInterceptor);
        return interceptor;
    }
}

配置項說明:

配置項說明示例
setMaxTime(long maxTime)設置 SQL 執(zhí)行的最大時長(單位:ms),超過時間將拋出異常,默認 -1(不限制)performanceInterceptor.setMaxTime(500); // 超過 500ms 警告
setFormat(boolean format)是否格式化 SQL,默認 false,開啟后會美化 SQL 輸出performanceInterceptor.setFormat(true);

日志輸出:

當查詢執(zhí)行時間超過 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框架 效果圖:

實現(xiàn)步驟:

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) | 執(zhí)行語句: %(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.自定義日志輸出格式:

首先創(chuàng)建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";// 黃色(執(zhí)行時間)  
    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 執(zhí)行時間(ms)  
     * @param category SQL 類型(如 statement、commit、rollback)  
     * @param prepared 預編譯 SQL(帶 ? 占位符)  
     * @param sql 真實 SQL 語句(占位符替換后的)  
     * @param url 數(shù)據(jù)庫連接 URL  
     * @return 格式化后的日志字符串  
     */  
    @Override  
    public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {  
        // 過濾空 SQL        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執(zhí)行 SQL: %s%s;\n",  
                CYAN, currentTime, RESET,           // 時間(青色)  
                YELLOW, elapsed, RESET,            // 執(zhí)行時間(黃色)  
                BLUE, connectionId, RESET,         // 連接 ID(藍色)  
                RED, category, RESET,              // 分類(紅色)  
                GREEN, sql.trim(), RESET           // SQL 語句(綠色)  
        );  
    }  
}

然后將配置文件中的格式化器屬性改為自己的類 :

# 自定義日志打印  
logMessageFormat=warren.reggie.common.P6SpyLogger  

到此這篇關于Springboot中分析SQL性能的兩種方式詳解的文章就介紹到這了,更多相關Springboot 分析sql性能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中Stream流對多個字段進行排序的方法

    Java中Stream流對多個字段進行排序的方法

    我們在處理數(shù)據(jù)的時候經常會需要進行排序后再返回給前端調用,比如按照時間升序排序,前端展示數(shù)據(jù)就是按時間先后進行排序,下面這篇文章主要給大家介紹了關于Java中Stream流對多個字段進行排序的相關資料,需要的朋友可以參考下
    2023-10-10
  • Mybatis分頁插件PageHelper手寫實現(xiàn)示例

    Mybatis分頁插件PageHelper手寫實現(xiàn)示例

    這篇文章主要為大家介紹了Mybatis分頁插件PageHelper手寫實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • java spring整合junit操作(有詳細的分析過程)

    java spring整合junit操作(有詳細的分析過程)

    這篇文章主要介紹了java spring整合junit操作(有詳細的分析過程),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • spring整合Quartz框架過程詳解

    spring整合Quartz框架過程詳解

    這篇文章主要介紹了spring整合Quartz框架過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題(最新推薦)

    解決org.apache.ibatis.binding.BindingException:?Invalid?boun

    這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • java集合map取key使用示例 java遍歷map

    java集合map取key使用示例 java遍歷map

    這篇文章主要介紹了java集合map取key使用示例,需要的朋友可以參考下
    2014-02-02
  • Java中ArrayList和LinkedList區(qū)別

    Java中ArrayList和LinkedList區(qū)別

    這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別,下面我們就重點聊一聊在日常開發(fā)中經常被使用到的兩個集合類ArrayList和LinkedList的本質區(qū)別吧,需要的朋友可以參考一下
    2022-01-01
  • Java線程間協(xié)作wait、notify和notifyAll詳解

    Java線程間協(xié)作wait、notify和notifyAll詳解

    這篇文章主要介紹了Java線程間協(xié)作wait、notify和notifyAll詳解,在 Java 中可以用 wait、notify 和 notifyAll 來實現(xiàn)線程間的通信,盡管關于wait和notify的概念很基礎,它們也都是Object類的函數(shù),但用它們來寫代碼卻并不簡單,,需要的朋友可以參考下
    2023-10-10
  • 詳解SpringBoot 添加對JSP的支持(附常見坑點)

    詳解SpringBoot 添加對JSP的支持(附常見坑點)

    這篇文章主要介紹了詳解SpringBoot 添加對JSP的支持(附常見坑點),非常具有實用價值,需要的朋友可以參考下
    2017-10-10
  • 如何使用Jenkins構建GIT+Maven項目

    如何使用Jenkins構建GIT+Maven項目

    這篇文章主要介紹了如何使用Jenkins構建GIT+Maven項目,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論

涿州市| 河池市| 濉溪县| 蛟河市| 都兰县| 沧州市| 乳源| 东兴市| 逊克县| 莲花县| 泽普县| 台东县| 浦东新区| 中山市| 保山市| 城固县| 额尔古纳市| 务川| 建昌县| 宁安市| 北安市| 邢台县| 青阳县| 八宿县| 台州市| 含山县| 界首市| 盐池县| 磐石市| 乌兰县| 西乌珠穆沁旗| 当阳市| 横峰县| 蒲江县| 洪洞县| 仪陇县| 聂拉木县| 逊克县| 平邑县| 扎囊县| 额尔古纳市|