스프링부트 배치에서 Cursor 사용 시 간단하게 read 구현하여 사용 가능하다.

커서로 read 구현하여 사용 시 속도는 mybatis paging 처리보다 read 속도가 빠르게 나왔다.

두 방식에서 장단점이 있어 비즈니스 로직에 따라 필요한 방식으로 구현하면 될 것으로 보인다.

페이징 처리 시 대용량 데이터를 JVM에 올리기때문에 메모리 부담이 있어 GC, OOM 발생 가능성이 있으나 병렬 처리 시 구현방법에 대한 편의성이 있고

커서 방식으로 처리 시 GC, OOM 이 발생한 가능성은 적으나 병렬 처리 시 partition 이나 flow 로 별도 프로세스로 동작하도록 구현해야한다.


550만 건 chunk 10만 건씩 처리 시 read 속도 측정 시

1. MyBatisCursorItemReader : 1분 19초 소요

2. MyBatisPagingItemReader :2분 22초 소요



@bean
public MyBatisCursorItemReader<Map<String, Object>> cursorReader(){

   Map<String, Object> paramMap = new HashMap<String, Object>

   reurn new MyBatisCursorItemReaderBuilder<Map<String, Object>>()
                      .sqlSessionFactory(sqlSessionFactory)
                      .queryId("sample.selectTable")
                      .parameterValues(paramMap)
                      .build();
}


@Bean
public MyBatisPagingItemReader<Map<String, Object>> pagingReader(){

    Map<String, Object> paramMap = new HashMap<String, Object>

   return new MyBatisPagingItemReaderBuilder<Map<String, Object>>(){
                         .sqlSessionFactory(sqlSessionFactory)
                         .queryId("sample.selectTable")
                         .parameterValues(paramMap)
                         .pageSize(100_000)
                         .build();
   }
}

'Develop > Spring Boot Batch' 카테고리의 다른 글

SqlSession Cursor 사용방법  (0) 2023.02.07

+ Recent posts