这两天公司发下来一个任务,做一个定时任务,每个月月底的时候,自动去另外一个表中查出来全量数据,并新增到备份表中,当然备份表中多了3个字段,很简单的一个需求,全部查出来之后,放到一个新的arrayList里,在用mybatis的foreach标签循环插入,但是在测试的时候,出现了下边的问题,如果你们也遇到了,可以看下。
报错的异常: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (21593854 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
大概意思就是说jdbc可接受的包太大了,因为数据量过大,报错了。网上说可以修改服务器的配置什么的,但是生产上一般不会因为一个这个就更改配置,所以只能换一个思路,
将这个新的list每2000个数据去循环插入即可,具体代码如下:
//要循环插入的list的size
final int listSize = iplanProjectScheduledHistoryEntityList.size();
int toIndex = 2000;
int keyToken = 0;
for (int i = 0; i < iplanProjectScheduledHistoryEntityList.size(); i += 2000) {
if (i + 2000 > listSize) { //作用为toIndex最后没有100条数据则剩余几条newList中就装几条
toIndex = listSize - i;
}
final List<IplanProjectScheduledHistoryEntity> newList = iplanProjectScheduledHistoryEntityList.subList(i, i + toIndex);
iplanProjectScheduledInfoMapper.batchInsertHistory(newList);
keyToken++;
}
代码可直接复用,只需换成自己的list即可!