스프링부트 활용 웹개발 실무용 - E07 Mybatis와 Mysql 환경에서 대용량 빠르게 등록

해내면 그만!XX·2022년 7월 29일
0

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

0개의 댓글