mybatis引起的線程池線程打滿問題排查過程-踩坑集錦 30(一週一更 補上週)
theme: arknights
背景
我們有個業務服務長期沒有進行過上線,但是服務器監控經常會發生報警,提示cpu使用率100%影響線上生產,偶發的現象所以一開始沒注意,後續經過排查才發現原來是踩中了一個“坑”
排查過程
1、首先排除了新業務上線的問題
2、其次通過服務器的監控排除了硬件故障的問題
3、於是使用java線程分析工具,分析了導致cpu過高的都是哪些線程
排查就會發現mybatis執行的相關線程。
4、於是我們根據提示找到相應的源碼處進行分析。mybatis組裝sql語句這裏,這段代碼,在sql很長的並且入參很多説的時候,下面對sql的拼接,將#{屬性名}替換成?是很耗費cpu的;
5、那麼導致這個問題的原因是什麼呢?我們針對mapper裏的sql語句發現,有個查詢條件入參是個list, mapper是這麼寫
6、為了驗證問題,我們自己做了一個測試,通過入參條件的調整,來進行執行時間的監控驗證,最後經過反覆的測試發現當入參list的數量達到10萬級別的時候,cpu就飆升到了120%,執行了29s,是造成線程等待的元兇
總結
在使用list做mapper入參,一定要考慮上限
「其他文章」