0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣去解決MyBatis引起的線程池線程打滿問題呢

jf_ro2CN3Fa ? 來源:稀土掘金 ? 作者:樹洞君 ? 2022-10-17 16:24 ? 次閱讀

背景

我們有個業(yè)務(wù)服務(wù)長期沒有進行過上線,但是服務(wù)器監(jiān)控經(jīng)常會發(fā)生報警,提示 cpu 使用率 100% 影響線上生產(chǎn)。偶發(fā)的現(xiàn)象,所以一開始沒注意,后續(xù)經(jīng)過排查才發(fā)現(xiàn)原來是踩中了一個“坑”。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

排查過程

1、首先排除了新業(yè)務(wù)上線的問題

2、其次通過服務(wù)器的監(jiān)控排除了硬件故障的問題

3、于是使用 java 線程分析工具,分析了導(dǎo)致 cpu 過高的都是哪些線程

b970de72-4dc0-11ed-a3b6-dac502259ad0.jpg

發(fā)現(xiàn)異常線程

排查就會發(fā)現(xiàn) mybatis 執(zhí)行的相關(guān)線程。

4、于是我們根據(jù)提示找到相應(yīng)的源碼處進行分析。mybatis 組裝 sql 語句這里,這段代碼,在 sql 很長的并且入?yún)⒑芏嗾f的時候,下面對 sql 的拼接,將#{屬性名}替換成?是很耗費 cpu 的。

b98368ee-4dc0-11ed-a3b6-dac502259ad0.jpg

MyBatis拼接大SQL耗費性能

5、那么導(dǎo)致這個問題的原因是什么呢?我們針對 mapper 里的 sql 語句發(fā)現(xiàn),有個查詢條件入?yún)⑹莻€ list,mapper 是這么寫:

b9ac1a28-4dc0-11ed-a3b6-dac502259ad0.jpg

foreach

6、為了驗證問題,我們自己做了一個測試,通過入?yún)l件的調(diào)整,來進行執(zhí)行時間的監(jiān)控驗證,最后經(jīng)過反復(fù)的測試發(fā)現(xiàn)「當(dāng)入?yún)?list 的數(shù)量達到 10 萬級別的時候,cpu 就飆升到了 120%,執(zhí)行了 29s,是造成線程等待的元兇」

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

總結(jié)

「在使用 list 做 mapper 入?yún)?,一定要考慮上限」

另外,sql 的 in 里面的數(shù)據(jù)也太多了吧,sql 太長超過 max_allow_packet 會報錯的。這個 MySQL 配置,建議不要往大了改!






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104100
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    750

    瀏覽量

    43900
  • RBAC
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    9924

原文標(biāo)題:MyBatis引起的線程池線程打滿問題排查過程

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    跨平臺的線程組件--TP組件

    /銷毀代價是很高的。那么我們要怎么設(shè)計多線程編程???答案:對于長駐的線程,我們可以創(chuàng)建獨立的線程
    的頭像 發(fā)表于 04-06 15:39 ?779次閱讀

    Java中的線程包括哪些

    線程是用來統(tǒng)一管理線程的,在 Java 中創(chuàng)建和銷毀線程都是一件消耗資源的事情,線程可以重復(fù)
    的頭像 發(fā)表于 10-11 15:33 ?730次閱讀
    Java中的<b class='flag-5'>線程</b><b class='flag-5'>池</b>包括哪些

    為什么會有線程?怎樣操作線程

    信號是什么?信號是如何產(chǎn)生的?為什么會有線程?怎樣操作線程?
    發(fā)表于 12-23 07:27

    線程是如何實現(xiàn)的

    線程的概念是什么?線程是如何實現(xiàn)的?
    發(fā)表于 02-28 06:20

    基于線程技術(shù)集群接入點的應(yīng)用研究

    本文在深入研究高級線程技術(shù)的基礎(chǔ)上,分析、研究了固定線程數(shù)目的線程線程數(shù)目動態(tài)變化的
    發(fā)表于 01-22 14:21 ?5次下載

    基于Nacos的簡單動態(tài)化線程實現(xiàn)

    本文以Nacos作為服務(wù)配置中心,以修改線程核心線程數(shù)、最大線程數(shù)為例,實現(xiàn)一個簡單的動態(tài)化線程
    發(fā)表于 01-06 14:14 ?766次閱讀

    線程線程

    線程通常用于服務(wù)器應(yīng)用程序。 每個傳入請求都將分配給線程池中的一個線程,因此可以異步處理請求,而不會占用主線程,也不會延遲后續(xù)請求的處理
    的頭像 發(fā)表于 02-28 09:53 ?670次閱讀
    多<b class='flag-5'>線程</b>之<b class='flag-5'>線程</b><b class='flag-5'>池</b>

    Java線程核心原理

    看過Java線程源碼的小伙伴都知道,在Java線程池中最核心的類就是ThreadPoolExecutor,
    的頭像 發(fā)表于 04-21 10:24 ?754次閱讀

    如何用C++實現(xiàn)一個線程?

    C++線程是一種多線程管理模型,把線程分成任務(wù)執(zhí)行和線程調(diào)度兩部分。
    發(fā)表于 06-08 14:53 ?1514次閱讀
    如何用C++實現(xiàn)一個<b class='flag-5'>線程</b><b class='flag-5'>池</b><b class='flag-5'>呢</b>?

    線程線程怎么釋放

    線程分組看,pool名開頭線程占616條,而且waiting狀態(tài)也是616條,這個點就非常可疑了,我斷定就是這個pool開頭線程導(dǎo)致的問題。我們先排查為何這個
    發(fā)表于 07-31 10:49 ?2066次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的<b class='flag-5'>線程</b>怎么釋放

    Spring 的線程應(yīng)用

    我們在日常開發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個線程方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程
    的頭像 發(fā)表于 10-13 10:47 ?523次閱讀
    Spring 的<b class='flag-5'>線程</b><b class='flag-5'>池</b>應(yīng)用

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優(yōu)勢 C++線程簡介
    的頭像 發(fā)表于 11-10 10:24 ?408次閱讀

    線程的基本概念

    ? 呃呃,我這么問就很奇怪,因為線程是什么我都沒說,怎么會知道為什么會有線程?所以我打算帶大家去思考一個場景: 當(dāng)我們的程序中:有一批
    的頭像 發(fā)表于 11-10 16:37 ?428次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的基本概念

    線程的創(chuàng)建方式有幾種

    線程是一種用于管理和調(diào)度線程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過預(yù)先創(chuàng)建一組線程并維護一個工作隊列,將任務(wù)提交給線程
    的頭像 發(fā)表于 12-04 16:52 ?660次閱讀

    什么是動態(tài)線程?動態(tài)線程的簡單實現(xiàn)思路

    因此,動態(tài)可監(jiān)控線程一種針對以上痛點開發(fā)的線程管理工具。主要可實現(xiàn)功能有:提供對 Spring 應(yīng)用內(nèi)線程
    的頭像 發(fā)表于 02-28 10:42 ?469次閱讀