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、请问有没有更好的方法去处理这个问题?
请大神指教,谢谢。

阅读 4.5k
4 个回答

1:业务规范数据量
2:解决方法思路就是你的分批保存

新手上路,请多包涵

既然上游已经把这么大的数据传过来了,说明这些数据已经在内存中了,只要不再深拷贝对象,一般不会出现OOM。
需要注意的是,如果这些数据是通过rpc或者其他网络方式传进来的,有可能造成堆外内存溢出。

  1. 业务限制,每次最多更新xxx条记录
  2. 和你的思路一样,分批做插入

1、如果是外部传进来数据量不做控制,这里控制也无法本质上避免OOM;
2、如果为了提高效率,可以使用mybais的批量执行器;
3、另外可以基于数据量开多个线程并行执行来提高效率;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题