優化背景:項目中有一個批量更新的方法,由於代碼邏輯是逐個調用數據庫進行更新,導致在更新數量多的情況下,整個方法執行慢。
正常業務情況下,更新的數量能達到500個,假設更新一個耗時為100ms,那么500個需要的時間為50秒,用戶肯定等不了那么久,需要優化。
一開始想法是,開啟多線程去更新,一個線程執行一個sql更新,我便動起手來,發現用多線程效果確實還可以,500個數據庫更新耗時大概3秒。喜笑顏開。
然而,后面分析這個改動會帶來的影響是:
原來這是一個事務方法,在使用多線程之后,那么這些批量更新就不在同一個事務了,那么可能存在某個線程中某個執行異常了,但是其他線程中的任務依然提交成功,就達不到事務的效果了。
(事務狀態基於threadlocal來保存,不同線程那么threadlocal則不同)
那么如果解決上面遇到的問題呢?
剛開始想到兩個方法:
方法一 : 讓這些線程共用同一個事務,那么則需要自定義一個事務管理器,(這個個人感覺比較麻煩),只是有這個想法,還未去實現。
方法二:讓這500個sql更新操作,變成一個批量更新的sql,減少網絡傳輸的耗時。
最終使用了方法二,優化執行效率同時也保證了事務。