詳解mybatis批量插入10萬(wàn)條數(shù)據(jù)的優(yōu)化過(guò)程
數(shù)據(jù)庫(kù) 在使用mybatis插入大量數(shù)據(jù)的時(shí)候,為了提高效率,放棄循環(huán)插入,改為批量插入,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);
}
實(shí)體類:
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;
}
測(cè)試類如下:
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));
}
}
為了復(fù)現(xiàn)bug,我限制了JVM內(nèi)存:

執(zhí)行測(cè)試類報(bào)錯(cuò)如下:
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOf(Arrays.java:3746)
可以看到,Arrays在申請(qǐng)內(nèi)存的時(shí)候,導(dǎo)致棧內(nèi)存溢出
改進(jìn)方法,分批新增:
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流表達(dá)式,skip表示跳過(guò)前i*10000條記錄,limit表示讀取當(dāng)前流的前10000條記錄
testMapper.testBatchInsert(list.stream().skip(i*10000).limit(10000).collect(Collectors.toList()));
}
}
}
還有一種方法是調(diào)高JVM內(nèi)存,不過(guò)不建議使用,不僅吃內(nèi)存,而且數(shù)據(jù)量過(guò)大會(huì)導(dǎo)致sql過(guò)長(zhǎng)報(bào)錯(cuò)
到此這篇關(guān)于詳解mybatis批量插入10萬(wàn)條數(shù)據(jù)的優(yōu)化過(guò)程的文章就介紹到這了,更多相關(guān)mybatis批量插入10萬(wàn)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ThreadPoolExecutor線程池原理及其execute方法(詳解)
下面小編就為大家?guī)?lái)一篇ThreadPoolExecutor線程池原理及其execute方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
淺談maven的jar包和war包區(qū)別 以及打包方法
下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11
Java線程池必知必會(huì)知識(shí)點(diǎn)總結(jié)
這篇文章主要給大家介紹了關(guān)于Java線程池必知必會(huì)知識(shí)點(diǎn)的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
SpringBoot項(xiàng)目修改訪問(wèn)端口和訪問(wèn)路徑的方法
這篇文章主要介紹了SpringBoot項(xiàng)目修改訪問(wèn)端口和訪問(wèn)路徑的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開發(fā)環(huán)境和測(cè)試環(huán)境
這篇文章主要介紹了SpringBoot框架實(shí)現(xiàn)切換啟動(dòng)開發(fā)環(huán)境和測(cè)試環(huán)境,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(15)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07
mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn),結(jié)合了mybatis-plus的插件方式,做出了自己的注解方式的數(shù)據(jù)權(quán)限,雖然可能存在一部分的局限性,但很好的解決了我們自己去解析SQL的功能,需要的朋友可以參考下2023-06-06
Mybatisplus更新某個(gè)字段為null問(wèn)題
Mybatisplus更新某個(gè)字段為null時(shí),可以使用@TableField(updateStrategy=FieldStrategy.IGNORED)注解,該注解提供了字段映射、忽略非表字段、自動(dòng)填充策略、字段條件處理等功能2025-02-02

