【原創做品,轉載請註明出處】html
寫這篇文章以前想着給這篇博客起一個文藝一點的標題,思來想去,想到了那些年咱們爬過的山,或者咱們一塊兒趟過的河?代碼不規範,同事兩行淚,這是多麼痛的領悟啊!java
本組一名實習生,因爲學校有事情須要回去處理,我便將他的代碼接管過來,正好遇上本次迭代上線,須要將同事的代碼提交測試,若是被測試出來有bug,我就來負責bug修復,代碼優化等。因爲不一樣的開發人員都有本身的編程習慣,因此不一樣人員所寫的代碼多少都會有些差別,好比:變量的命名、代碼的格式等,即便組內有一套開發規範也仍是會出現一些差別,這就是所謂的個性?特色? 固然 特色只是特色,並不能稱得上個性。既然風格不一樣,那麼看別人代碼的時候會有值得學習的地方,也有本身感受不舒服的地方。也罷,畢竟人都有「個性」。mysql
此次我接手同事的代碼主要是一個Excel導入數據庫這樣一個功能,在測試人員測試導入數據的時候,使用的導入數據有2w條做爲測試數據導入數據庫,現象是 導入後發現頁面先是顯示上傳中,以後頁面沒有任何反饋,經排查後發現是由於後臺還在處理導入數據邏輯,時間過長頁面沒有獲得反饋,致使頁面超時。sql
對於本次問題的排查,能夠總結爲問題發現,和問題排查。發現問題時首先要快速瞭解該功能的主要邏輯是什麼,此次的導入主要有兩點,一是 導入前判斷是否有和數據庫重複,二是導入操做。弄明白主要邏輯以後,就要分析,導入慢確定是這兩個邏輯的某一個邏輯慢,或者是兩個邏輯都慢。通過分析發現,這兩個邏輯都出現了循環創建數據庫鏈接的問題,發現了問題的根本緣由後,就要減小創建數據庫鏈接次數,問題便獲得解決。數據庫
對於導入前和數據庫判斷是否有重複的,使用了mysql的一個關鍵字ignore,關鍵字的做用是:如有致使unique key 衝突的記錄,則該條記錄不會被插入到數據庫中,去重字段必定要是惟一索引。其餘就是拼接SQL使用批量導入。下面將主要的代碼貼出來供你們參考。編程
// 批量入庫,每次批量插入100條 List<Detail> detailList = new ArrayList<>(); List<List<Detail>> tempList = new ArrayList<>(); int insertCount = 100; for (int i = 0; i < detailList.size(); i += insertCount) { if ((i + insertCount) < detailList.size()) { List<Detail> newList = new ArrayList<>(); newList.addAll(detailList.subList(i, i + insertCount)); tempList.add(newList); } else { List<Detail> newList = new ArrayList<>(); newList.addAll(detailList.subList(i, detailList.size())); tempList.add(newList); } } Map<String, Object> map = detailManager.batchInsertDetail(tempList);
<insert id="batchInsertDetail" parameterType="java.util.List"> insert ignore into my_table (id,code,status) values <foreach collection ="list" item="detail" index= "index" separator =","> (#{detail.id,jdbcType=BIGINT},#{detail.code,jdbcType=VARCHAR},#{detail.status,jdbcType=TINYINT}) </foreach > </insert>
原文出處:https://www.cnblogs.com/luao/p/10503345.htmlmybatis