某日,在測(cè)試環(huán)境觀察中發(fā)現(xiàn),即使是一個(gè)很簡(jiǎn)單的sql語(yǔ)句執(zhí)行都會(huì)導(dǎo)致執(zhí)行時(shí)間達(dá)到500ms以上,而sql在數(shù)據(jù)庫(kù)執(zhí)行只需要20ms左右。
為了解決這個(gè)問題,我首先使用jstack 將日志所有堆棧打印出現(xiàn)觀察,在日志中觀察發(fā)現(xiàn),大量的線程阻塞在Class.forName()

image.png
從堆棧可以看到,是阻塞在了Class.forName,再根據(jù)最深的堆棧可以觀察到,在硬盤檢索文件。通過查看對(duì)應(yīng)的源碼文件發(fā)現(xiàn),這是一個(gè)公司級(jí)組件,通過try catch Class.forName的方式兼容某個(gè)框架的不同版本。而我當(dāng)前使用的版本Class.forName是找不到的,導(dǎo)致每次Class.forName都會(huì)在硬盤檢索一次文件,導(dǎo)致每次sql執(zhí)行檢索一次硬盤文件浪費(fèi)了500ms。
最終通過調(diào)整機(jī)制,僅在啟動(dòng)的時(shí)候Class.forname判斷一個(gè)對(duì)應(yīng)框架的版本號(hào)解決。