背景
我們有個業(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 過高的都是哪些線程
發(fā)現(xiàn)異常線程
排查就會發(fā)現(xiàn) mybatis 執(zhí)行的相關(guān)線程。
4、于是我們根據(jù)提示找到相應(yīng)的源碼處進行分析。mybatis 組裝 sql 語句這里,這段代碼,在 sql 很長的并且入?yún)⒑芏嗾f的時候,下面對 sql 的拼接,將#{屬性名}替換成?是很耗費 cpu 的。
MyBatis拼接大SQL耗費性能
5、那么導(dǎo)致這個問題的原因是什么呢?我們針對 mapper 里的 sql 語句發(fā)現(xiàn),有個查詢條件入?yún)⑹莻€ list,mapper 是這么寫:
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 配置,建議不要往大了改!
審核編輯:劉清
-
JAVA
+關(guān)注
關(guān)注
19文章
2943瀏覽量
104100 -
SQL
+關(guān)注
關(guān)注
1文章
750瀏覽量
43900 -
RBAC
+關(guān)注
關(guān)注
0文章
43瀏覽量
9924
原文標(biāo)題:MyBatis引起的線程池線程打滿問題排查過程
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論