728x90
반응형
이 문서는 추후 다시 볼 목적으로 정리한 글입니다.
우연찮게 글을 읽어보게 됐는데 정리하면 좋을 것 같아서 기록.
혹시 읽다가 틀린 점이 있으면 알려주시면 감사하겠습니다.
JdbcCursorItemReader vs JdbcPagingItemReader
- reference 에 나온 답변을 보면 이용하는 데이터베이스와 처리하는 모델에 따라 달라진다고 하는데 이 말이 이해가 안간다.
- 추측하기로는 각 Reader 들은 fetchSize 를 통해 데이터를 받아오고 이는 네트워크를 거치는데 특정 DBMS 에서는 이 옵션이 안먹히기 때문이다.
- pagingItemReader 는 paging 만큼 데이터를 가져와야하는데 fetchSize 옵션이 제대로 설정돼지 않으면 어떻게 동작할지를 모를테고.
- 마찬가지로 cursorItemReader 도 fetchSize 만큼 가져와야하는데 특정 DBMS 에서 옵션이 작동안할 수 있으니 어떤 것이 성능이 좋은지 판단할려면 테스트 해보는 수밖에 없다.
- 결국 위 내용의 결론은 테스트 환경을 만들어서 테스트 해보고 파악하는 것이 최선이라 생각된다.
CursorItemReader
- cursor 처럼 row 의 포인터를 한 칸씩 이동해서 조회하는 개념
- JdbcCursorItemReader 내부 동작은 다음과 같음. fetchSize 만큼 메모리로 가져오고, 메모리에서 one row 씩 읽고 메모리로 가져온 데이터를 다시 읽으면 fetchSize 테이블에서 다시 읽어오는 것.
- 그렇기에 DB 에서 table 을 한 번에 조회해서 메모리에 한 번에 담았을 때 Out Of Memory 가 발생한다면, CursorItemReader 방식을 사용하면 좋다고 생각.
- 멀티 스레드 환경 고려 x
PagingItemReader
- 몇 번 부터 몇 번까지 읽을지 결정해서 해당 범위만큼 쿼리를 수행하여 데이터를 읽어오는 방법.
- 예를 들면, 0~1000 번을 읽어오겠다면 해당 데이터를 읽어와서 메모리에 한 번에 올리는 방법.
- MyBatisPagingItemReader 소스를 보니 synchronized 를 걸어서 readPage 하고 있음. 멀티 쓰레드 환경을 고려해서 만들었음.
- 주의할 점은 한 번에 가져오는 PageSize 가 너무 크다면 out of memory 가 발생할 수 있다.
spring-batch parallel option
- 아래 글에 보면 spring-batch 병렬 처리 옵션에 대표적인 것이 2개가 있다고 얘기함.
- Multi Thread Step, Partitioning
- Multi Thread Step 은 구성하기 쉽다고 설명. (TaskExecutor 만 설정해주면 되니)
- 단, restart 기능을 구현하기에 복잡하다. (chunked 단위가 어떻게 실행될지 감이 안잡히니)
- Partitioning 은 구성하기에 복잡하나 재시작을 보장한다 라고 설명하고 있다.
- 내 생각은 다음과 같다. Multi Process 를 써서 Job 을 실행하는게 가장 best 이지 않을까.
- Multi Thread 는 restart 기능 이 복잡.
- Partitioning 기능도 로그 보기가 힘들고, 하나의 스텝이 장애가 나면 다른 스텝에도 영향을 미친다. (하나의 Process 이니)
reference
'Spring > batch' 카테고리의 다른 글
spring-batch RunIdIncrementer 정리 (0) | 2020.09.01 |
---|---|
Spring Batch ORA-08177 (0) | 2020.08.18 |
spring boot, spring batch 정리 - 1편 환경 구성 (spring boot, spring batch, gradle, multi project) (0) | 2020.07.11 |
spring boot, spring batch 정리 - 4편 JdbcCursorItemReader NamedParameter 사용 예제 (0) | 2020.07.09 |
spring boot, spring batch 정리 - 3편 repeat step 예제 (파라미터만 변경해서 실행) (0) | 2020.07.08 |
댓글