批处理原因

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

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

解决方案

// 批次最大保存数量
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行的时候,会遇到锁表的情况。如果并发插入,甚至发生死锁。这个时候,就要根据经验分析,调整每个批次的量,以避免影响使用。

更多推荐