数据库插入数据量过大时分批插入处理(JAVA)

批处理原因

1、一次性全部插入,mysql的sql语句是有最大长度限制的,默认是1M,可配置,超过最大长度就会报错。

2、一条条插入,数据传输多次,事务处理多次,会造成资源浪费。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 批次最大保存数量
int batchNum = 500;

// 总数据量
int insertLength = list.size();

int i = 0;
while (insertLength > batchNum) {
briefCntechRangesDataMapper.insertList(list.subList(i, i + batchNum));
i = i + batchNum;
insertLength = insertLength - batchNum;
}

// 保存首次或最后一次数据量不足"批次最大保存数量"的数据
if (insertLength > 0) {
briefCntechRangesDataMapper.insertList(list.subList(i, i + insertLength));
}

     在特殊情况下,比如插入的数据是业务表,每行的数据量较大,且该表访问频繁,那么,插入1条的时候可能不会锁表,而插入10000行的时候,会遇到锁表的情况。如果并发插入,甚至发生死锁。这个时候,就要根据经验分析,调整每个批次的量,以避免影响使用。