mybatis批量插入10万数据 详解mybatis批量插入10万条数据的优化过程

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

mybatis批量插入10万数据 详解mybatis批量插入10万条数据的优化过程

大造梦家   2021-04-16 我要评论
想了解详解mybatis批量插入10万条数据的优化过程的相关内容吗,大造梦家在本文为您仔细讲解mybatis批量插入10万数据的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:mybatis,批量插入10万数据,mybatis,批量插入,mybatis,大批量插入,下面大家一起来学习吧。

数据库 在使用mybatis插入大量数据的时候,为了提高效率,放弃循环插入,改为批量插入,mapper如下:

package com.lcy.service.mapper;

import com.lcy.service.pojo.TestVO;
import org.apache.ibatis.annotations.Insert;

import java.util.List;

public interface TestMapper {

    @Insert("")
    Integer testBatchInsert(List list);
}

实体类:

package com.lcy.service.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class TestVO {

    private String t1;

    private String t2;

    private String t3;

    private String t4;

    private String t5;

}

测试类如下:

import com.lcy.service.TestApplication;
import com.lcy.service.mapper.TestMapper;
import com.lcy.service.pojo.TestVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo {

    @Autowired
    private TestMapper testMapper;

    @Test
    public void insert() {
        List list = new ArrayList<>();
        for (int i = 0; i < 200000; i++) {
            list.add(new TestVO(i + "," + i, i + "," + i, i + "," + i, i + "," + i, i + "," + i));
        }
        System.out.println(testMapper.testBatchInsert(list));
    }

}

为了复现bug,我限制了JVM内存:

执行测试类报错如下:

java.lang.OutOfMemoryError: Java heap space

 at java.base/java.util.Arrays.copyOf(Arrays.java:3746)

可以看到,Arrays在申请内存的时候,导致栈内存溢出

改进方法,分批新增:

import com.lcy.service.TestApplication;
import com.lcy.service.mapper.TestMapper;
import com.lcy.service.pojo.TestVO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo {

    @Autowired
    private TestMapper testMapper;

    @Test
    public void insert() {
        List list = new ArrayList<>();
        for (int i = 0; i < 200000; i++) {
            list.add(new TestVO(i + "," + i, i + "," + i, i + "," + i, i + "," + i, i + "," + i));
        }
        int index = list.size() / 10000;
        for (int i=0;i< index;i++){
            //stream流表达式,skip表示跳过前i*10000条记录,limit表示读取当前流的前10000条记录
            testMapper.testBatchInsert(list.stream().skip(i*10000).limit(10000).collect(Collectors.toList()));
        }
    }
}

还有一种方法是调高JVM内存,不过不建议使用,不仅吃内存,而且数据量过大会导致sql过长报错

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们