프로젝트를 하면서 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