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

springboot 項(xiàng)目某個(gè)接口響應(yīng)特別慢問(wèn)題排查分析

 更新時(shí)間:2025年12月08日 17:19:07   作者:ByteX  
文章描述了一個(gè)Spring Boot項(xiàng)目中某個(gè)接口請(qǐng)求日志顯示耗時(shí)極短,但通過(guò)Postman發(fā)起相同請(qǐng)求時(shí)耗時(shí)顯著增加的問(wèn)題,經(jīng)過(guò)排查,發(fā)現(xiàn)耗時(shí)主要集中在自定義的ControllerInterceptor中的logBefore方法,特別是SensitiveInfoSerialize.getJson方法,感興趣的朋友跟隨小編一起看看吧

問(wèn)題現(xiàn)象

接口請(qǐng)求日志顯示耗時(shí)僅為幾十毫秒,但通過(guò)Postman發(fā)起相同請(qǐng)求時(shí),實(shí)際耗時(shí)卻高達(dá)7秒多。

[2025-12-02 09:06:27.344]-[INFO]-[http-nio-3012-exec-3]-[logId:6600b2f0-8d68-4c2c-a7b5-bce11a42e140]-[com.xxx.interceptor.ControllerInterceptor.info:63] 調(diào)用 接口://task/retry Class:com.xxx.xxx.xxx.controller.TaskController,Method:taskRetry,Request:101   
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63bd0ef2] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.jdbc.JDBC4Connection@3448c914] will not be xxxd by Spring
==>  Preparing: select id, task_code, task_name, task_desc, task_execute_time, task_over_time, task_timer, file_path, status, task_type, create_name, update_name, create_date, update_date from r_task where id = ? and status = ? 
==> Parameters: 101(Integer), 4(Byte)
<==      Total: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63bd0ef2]
[2025-12-02 09:06:27.354]-[WARN]-[http-nio-3012-exec-3]-[logId:6600b2f0-8d68-4c2c-a7b5-bce11a42e140]-[com.xxx..xxx.service.impl.RetryTaskServiceImpl.taskRetry:50]-任務(wù)重試任務(wù)查詢(xún)?yōu)榭?id:101
[2025-12-02 09:06:27.355]-[INFO]-[http-nio-3012-exec-3]-[logId:6600b2f0-8d68-4c2c-a7b5-bce11a42e140]-[com.xxx.interceptor.ControllerInterceptor.logReturn:81]-Class:com.xxx..xxx.controller.TaskController,Method:taskRetry,Response:{"code":"999","msg":"任務(wù)重試失敗"}

postman請(qǐng)求示例

問(wèn)題排查

先用arthas的 trace命令 確定哪塊執(zhí)行比較耗時(shí)

    `---[6792.636ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:intercept()
        +---[0.0061ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:getTarget() #655
        +---[0.005ms] org.springframework.aop.framework.AdvisedSupport:getInterceptorsAndDynamicInterceptionAdvice() #659
        +---[0.0079ms] org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation:<init>() #673
        +---[6792.5681ms] org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation:proceed() #673
        |   `---[10.2326ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:intercept()
        |       +---[0.0044ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:getTarget() #655
        |       +---[0.0047ms] org.springframework.aop.framework.AdvisedSupport:getInterceptorsAndDynamicInterceptionAdvice() #659
        |       +---[0.0092ms] org.springframework.aop.framework.AopProxyUtils:adaptArgumentsIfNecessary() #668
        |       +---[10.1483ms] org.springframework.cglib.proxy.MethodProxy:invoke() #669
        |       +---[0.0034ms] org.springframework.aop.framework.CglibAopProxy:access$000() #675
        |       `---[0.0031ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:releaseTarget() #680
        +---[0.0034ms] org.springframework.aop.framework.CglibAopProxy:access$000() #675
        `---[0.0025ms] org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor:releaseTarget() #680

經(jīng)過(guò)斷點(diǎn)調(diào)試,程序最終進(jìn)入了自定義的ControllerInterceptor中的logBefore方法。該方法的主要邏輯相對(duì)簡(jiǎn)單,主要用于打印請(qǐng)求日志并對(duì)輸入?yún)?shù)進(jìn)行脫敏處理。問(wèn)題出在負(fù)責(zé)參數(shù)脫敏的SensitiveInfoSerialize.getJson方法上。

通過(guò)斷點(diǎn)跟蹤發(fā)現(xiàn),程序是在MethodBeforeAdviceInterceptor中執(zhí)行this.advice.before這行代碼時(shí)進(jìn)入自定義ControllerInterceptor的。

public class MethodBeforeAdviceInterceptor implements MethodInterceptor, Serializable {
    private MethodBeforeAdvice advice;
    public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
        Assert.notNull(advice, "Advice must not be null");
        this.advice = advice;
    }
    public Object invoke(MethodInvocation mi) throws Throwable {
        this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
        return mi.proceed();
    }
}

ControllerInterceptor 的logBefore

 /**
     * /**
     * 記錄輸入日志
     *
     * @param joinPoint
     */
    @Before(value = "controllerService()")
    public void logBefore(JoinPoint joinPoint) {
        LogUtil.bindLogId(UUID.randomUUID().toString());
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        if (ArrayUtils.isNotEmpty(args)) {
            LogHelper.info(logger, "調(diào)用", "接口:" + logTool.getServiceKey(), "Class:" + className
                    + ",Method:" + methodName + ",Request:" + SensitiveInfoSerialize.getJson(args[0]), "", "", "");
        }
    }

這段代碼的核心邏輯是:

  1. 遍歷 Java Bean 的所有字段
  2. 識(shí)別帶有 SensitiveInfo 注解的 String 類(lèi)型字段
  3. 對(duì)這些字段執(zhí)行脫敏處理
  4. 對(duì)嵌套對(duì)象、數(shù)組、集合和 Map 進(jìn)行遞歸處理

需要注意的是,這是一個(gè)內(nèi)部工具類(lèi),雖然具體實(shí)現(xiàn)不便展示,但實(shí)際使用中存在一些需要注意的問(wèn)題。

結(jié)論

根本原因是對(duì)參數(shù)進(jìn)行遞歸的時(shí)候沒(méi)有排除基本數(shù)據(jù)類(lèi)型,導(dǎo)致對(duì)基本數(shù)據(jù)類(lèi)型的字段進(jìn)行遞歸導(dǎo)致耗時(shí)很長(zhǎng)。

所以使用遞歸時(shí)要特別注意退出條件,不然可能會(huì)導(dǎo)致耗時(shí)很長(zhǎng)甚至棧溢出。

到此這篇關(guān)于springboot 項(xiàng)目某個(gè)接口響應(yīng)特別慢排查的文章就介紹到這了,更多相關(guān)springboot接口響應(yīng)慢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot整合camunda+mysql的集成流程分析

    Springboot整合camunda+mysql的集成流程分析

    本文介紹基于mysql數(shù)據(jù)庫(kù),如何實(shí)現(xiàn)camunda與springboot的集成,如何實(shí)現(xiàn)基于springboot運(yùn)行camunda開(kāi)源流程引擎,本文分步驟圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • MyBatis Plus like參數(shù)為百分號(hào)%查詢(xún)結(jié)果異常原因分析及解決

    MyBatis Plus like參數(shù)為百分號(hào)%查詢(xún)結(jié)果異常原因分析及解決

    文章指出在MyBatisPlus使用LIKE查詢(xún)時(shí),用戶(hù)輸入的%可能導(dǎo)致通配符誤匹配,推薦使用ESCAPE轉(zhuǎn)義功能,將%轉(zhuǎn)換為普通字符,既支持模糊查詢(xún)又避免全表匹配,提升準(zhǔn)確性和性能
    2025-09-09
  • springboot集成dubbo注解版的示例代碼

    springboot集成dubbo注解版的示例代碼

    這篇文章主要介紹了springboot集成dubbo注解版的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 一篇文章帶你了解Spring?AOP?的注解

    一篇文章帶你了解Spring?AOP?的注解

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • idea2023設(shè)置啟動(dòng)參數(shù)、單元測(cè)試啟動(dòng)參數(shù)

    idea2023設(shè)置啟動(dòng)參數(shù)、單元測(cè)試啟動(dòng)參數(shù)

    在使用IDEA進(jìn)行開(kāi)發(fā)時(shí),我們可以通過(guò)設(shè)置一些啟動(dòng)參數(shù)來(lái)優(yōu)化開(kāi)發(fā)環(huán)境的性能和體驗(yàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • SpringSecurity導(dǎo)致SpringBoot跨域失效的問(wèn)題解決

    SpringSecurity導(dǎo)致SpringBoot跨域失效的問(wèn)題解決

    本文主要介紹了SpringSecurity導(dǎo)致SpringBoot跨域失效的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SpringBoot項(xiàng)目訪問(wèn)任意接口出現(xiàn)401錯(cuò)誤的解決方案

    SpringBoot項(xiàng)目訪問(wèn)任意接口出現(xiàn)401錯(cuò)誤的解決方案

    今天小編就為大家分享一篇關(guān)于SpringBoot項(xiàng)目訪問(wèn)任意接口出現(xiàn)401錯(cuò)誤的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java編程關(guān)于子類(lèi)重寫(xiě)父類(lèi)方法問(wèn)題的理解

    Java編程關(guān)于子類(lèi)重寫(xiě)父類(lèi)方法問(wèn)題的理解

    這篇文章主要介紹了Java編程關(guān)于子類(lèi)重寫(xiě)父類(lèi)方法問(wèn)題的理解,分享了有關(guān)子類(lèi)重寫(xiě)父類(lèi)的實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringMVC空指針異常NullPointerException解決及原理解析

    SpringMVC空指針異常NullPointerException解決及原理解析

    這篇文章主要介紹了SpringMVC空指針異常NullPointerException解決及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • MyBatis插件機(jī)制的使用及說(shuō)明

    MyBatis插件機(jī)制的使用及說(shuō)明

    MyBatis插件機(jī)制通過(guò)攔截器實(shí)現(xiàn),允許開(kāi)發(fā)者在不修改源代碼的情況下擴(kuò)展和定制MyBatis功能,主要攔截方法包括Executor、ParameterHandler、ResultSetHandler和StatementHandler,攔截器通過(guò)XML配置或Java代碼定義,實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的方法調(diào)用攔截和增強(qiáng)
    2026-01-01

最新評(píng)論

乐昌市| 新沂市| 石屏县| 宁远县| 香格里拉县| 昆山市| 上虞市| 乌兰县| 乌兰县| 定南县| 镶黄旗| 香格里拉县| 钟山县| 天镇县| 通道| 杭锦后旗| 准格尔旗| 乃东县| 喜德县| 广宗县| 东至县| 东宁县| 乌拉特后旗| 泾川县| 青海省| 平潭县| 安乡县| 天门市| 玉环县| 内丘县| 交口县| 平原县| 安国市| 松原市| 苏尼特左旗| 天柱县| 丁青县| 安化县| 莱芜市| 云梦县| 马龙县|