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