프로젝트를 하면서 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가 발생하지 않고 속도도 안정적이였다.