my batis 가 10 만 개의 데 이 터 를 대량으로 삽입 하 는 최적화 과정 을 상세 하 게 설명 합 니 다.
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 이 너무 길 어 집 니 다.my batis 가 10 만 개의 데 이 터 를 대량으로 삽입 하 는 최적화 과정 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 my batis 가 10 만 개의 데 이 터 를 대량으로 삽입 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 지원 을 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.