스프링부트 배치에서 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


프로젝트를 하면서 Spring Boot Batch 에서 커서를 적용한 케이스와 사용한 방법에 대하여 작성합니다.

 

- 커서를 적용한 케이스

   1) 약 1억 건의 데이터를 DB to DB 로 적재 시 GC가 발생하는 케이스가 있어 heap 메모리를 8GB로 변경하여도 동일한 증상이 지속되어 커서방식으로 변경함.

 

 

1. openSession() 으로 커서 세션 생성

 

try ( SqlSession sqlSession = sqlSessionFactory.openSession();

         Cursor<Map<String, Object>> cursor = sqlSession.selectCursor("sample.selectTable", param)) {

 

   for(Map<String, Object> data :cursor) {

      // 1 row 씩 데이터가 넘어온다.

   }

}

 

 

2. Mybatis 옵션 추가

fetchSize 는 Integer Minimum 값을 주게되면 1개의 row 씩 읽어 JVM에 데이터를 많이 올리지 않아 OOM이나 GC가 발생하지 않는다.

 

<select id="selectTable" parameterType="map" resultType="map" fetchSize="-2147483648" resultSetType="FORWARD_ONLY">

 

   select

      aaa, bbb, ccc

   from sampleTable

</select>

 

 

위와 같은 코드로 커서를 위한 session 생성 후 selectCursor() 를 통해 mybatis 쿼리 데이터를 계속해서 가저오게된다.

 

chunk 단위로 가저와서 processor, writer 로 처리하는 방법도 있지만 데이터 전체를 메모리로 가저와서 처리하지 않아 GC가 발생하지 않고 속도도 안정적이였다.

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

MybatisCursorItemReader  (0) 2023.02.07

+ Recent posts