? ? ? ? 最近在項目中遇到了批量插入數據的一些問題,一般圖省事都是利用mybatis或mybatis-plus的saveBatch方法,但這次因為數據過多,出現了一系列的問題,只能手動處理,接下來分享下對于數據量比較大的批量插入,可能遇到的幾個問題和處理方式:
1、saveBatch方法默認的是插入1000條數據,如果你的數據量超過1000條,還是想用這個方法的話,就需要指定數量,例如:
List<Student> list = new ArrayList<>();
//向集合中放入5000條數據, 根據實際情況來
// ...super.saveBatch(list, list.size())
2、因為saveBatch方法其實執行的還是循環insert插入,并且在insert語句中會包含表字段,如果你的表相對復雜,數據量過大的情況下可能導致超過MySQL允許的傳輸上限,具體的值我忘了,有興趣可以查詢了解下,導致發生異常回滾,這時候,你還是懶得寫sql,那么就只能分批處理了,按你自己的情況制定合理的批數據量,然后進行如下操作:
List<Student> list = new ArrayList<>();
//向集合中放入5000條數據, 根據實際情況來
// ...int batchSize = 1000;
int size = list.size();
for (int i = 0; i < size; i += batchSize) {int end = Math.min(i + batchSize, size);List<Student> subList = list.subList(i, end);super.saveBatch(subList);
}
3、上邊都是一些懶人做法,最佳的方式還是自己寫xml的insert語句,但是也要注意數據量,特別巨大的時候,還是要分批進行,這種情況一般少一些,大部分項目場景遇不到