springboot+mybatis+mysql批量新增数据时,如何避免数据量太大而出现OOM?
假如我在做一个批量插入数据到mysql的接口,但批量传进来的数据会有多大我不知道,在数据传进来以后会有一个list去接收。为了避免插入数据时出现OOM,请问可以怎么处理?
我的思路:对传进来的数据做细分,每1W条插入一次(假设一次最多能插入1W)。
实现代码:
public void insert(List<User> list) { int count = 10000; // 这里暂不考虑数据量小于10000的情况
int max = list.size();
int temp = count;
for(int i=0; i<max; i+=count){
if(max - i < count){
temp = max - i; // 假如总共有1.5万条数据,那么最后那5k的数据不能按最初设定的count=10000的量来取,所以这里做个处理。
}
List<Integer> list1 = list.subList(i, i+temp);
userMapper.insert(list1); // 每次传1W的数据到mapper方法里
}
}
1、请问这段代码能不能优化?
2、请问有没有更好的方法去处理这个问题?
请大神指教,谢谢。
回答:
1:业务规范数据量
2:解决方法思路就是你的分批保存
回答:
既然上游已经把这么大的数据传过来了,说明这些数据已经在内存中了,只要不再深拷贝对象,一般不会出现OOM。
需要注意的是,如果这些数据是通过rpc或者其他网络方式传进来的,有可能造成堆外内存溢出。
回答:
- 业务限制,每次最多更新xxx条记录
- 和你的思路一样,分批做插入
回答:
1、如果是外部传进来数据量不做控制,这里控制也无法本质上避免OOM;
2、如果为了提高效率,可以使用mybais的批量执行器;
3、另外可以基于数据量开多个线程并行执行来提高效率;
以上是 springboot+mybatis+mysql批量新增数据时,如何避免数据量太大而出现OOM? 的全部内容, 来源链接: utcz.com/p/944217.html