E07 Mybatis + MariaDB 활용하여 10000건 이상의 데이터 초스피드로 INSERT 하기
controller
/**
* 대용량 등록 처리.
*/
@ApiOperation(value = "대용량 등록처리1", notes = "대용량 등록처리1")
@PutMapping("/saveList1")
public BaseResponse<Boolean> saveList1() {
int count = 0;
// 테스트를 위한 랜덤 1만건의 데이터를 생성
List<BoardParameter> list = new ArrayList<BoardParameter>();
while (true) {
count++;
String title = RandomStringUtils.randomAlphabetic(10);
String contents = RandomStringUtils.randomAlphabetic(10);
list.add(new BoardParameter(title, contents));
if (count >= 10000) {
break;
}
}
//시간 측정
long start = System.currentTimeMillis();
boardService.saveList1(list);
long end = System.currentTimeMillis();
logger.info("실행 시간 : {}", (end - start) / 1000.0);
return new BaseResponse<Boolean>(true);
}
/**
* 대용량 등록 처리.
*/
@PutMapping("/saveList2")
@ApiOperation(value = "대용량 등록처리2", notes = "대용량 등록처리2")
public BaseResponse<Boolean> saveList2() {
int count = 0;
// 테스트를 위한 랜덤 1만건의 데이터를 생성
List<BoardParameter> list = new ArrayList<BoardParameter>();
while (true) {
count++;
String title = RandomStringUtils.randomAlphabetic(10);
String contents = RandomStringUtils.randomAlphabetic(10);
list.add(new BoardParameter(title, contents));
if (count >= 10000) {
break;
}
}
//시간 측정
long start = System.currentTimeMillis();
boardService.saveList2(list);
long end = System.currentTimeMillis();
logger.info("실행 시간 : {}", (end - start) / 1000.0);
return new BaseResponse<Boolean>(true);
}
service
/**
* 단순 반복문을 이용한 등록 처리.100개 이하에서 권장
*/
public void saveList1(List<BoardParameter> list) {
//1개가 생성될때마다 레파지토리 호출 =connection매번 호출
for (BoardParameter parameter : list) {
repository.save(parameter);
}
}
/**
* 100씩 배열에 담아서 일괄 등록 처리.
*/
public void saveList2(List<BoardParameter> boardList) {
Map<String, Object> paramMap = new HashMap<String, Object>();
//map에 리스트(1만건) 한번에 담아서 총 connection 1번 호출
paramMap.put("boardList", boardList);
repository.saveList(paramMap);
}
참조
https://github.com/stylehosting/example-spring/commit/a9aeb847bf65cfda00cef065d184047318ba7800