mybatis引起的線程池線程打滿問題排查過程-踩坑集錦 30(一週一更 補上週)

語言: CN / TW / HK

theme: arknights

背景

我們有個業務服務長期沒有進行過上線,但是服務器監控經常會發生報警,提示cpu使用率100%影響線上生產,偶發的現象所以一開始沒注意,後續經過排查才發現原來是踩中了一個“坑”

排查過程

1、首先排除了新業務上線的問題

2、其次通過服務器的監控排除了硬件故障的問題

3、於是使用java線程分析工具,分析了導致cpu過高的都是哪些線程

image.png 排查就會發現mybatis執行的相關線程。

4、於是我們根據提示找到相應的源碼處進行分析。mybatis組裝sql語句這裏,這段代碼,在sql很長的並且入參很多説的時候,下面對sql的拼接,將#{屬性名}替換成?是很耗費cpu的;

image.png

5、那麼導致這個問題的原因是什麼呢?我們針對mapper裏的sql語句發現,有個查詢條件入參是個list, mapper是這麼寫

image.png

6、為了驗證問題,我們自己做了一個測試,通過入參條件的調整,來進行執行時間的監控驗證,最後經過反覆的測試發現當入參list的數量達到10萬級別的時候,cpu就飆升到了120%,執行了29s,是造成線程等待的元兇

總結

在使用list做mapper入參,一定要考慮上限