Cursor 방식은 DB 서버 내부에 **커서(포인터)**를 생성하고, 클라이언트가 요청할 떄마다 한줄씩(또는 Fetch Size 만큼) 데이터를 넘겨준다.
read()를 호출하면, DB는 현재 포인터가 가리키는 데이터를 보내고 포인터를 다음으로 이동시킨다.JdbcCursorItemReader를 사용할 떄 일반적인 RDBMS 환경에서는 "쿼리가 실행된 시점의 스냅샷을 기준으로 동작하는 것이 기본이다.Undo Log나 Rollback Segment에 저장된 이전 버전의 데이터를 찾아내어 읽는다.즉, 중간에 데이터가 변해도 커서가 읽는 결과 데이터셋은 변하지 않는 것이 일반적이다.
UPDATE/DELETE 쿼리가 실패하거나, 배치가 Snapshot too old 에러로 뻗을 수 있다.| 상황 | Cursor 방식 (JdbcCursorItemReader) | Paging 방식 (JdbcPagingItemReader) |
|---|---|---|
| 데이터 양 | 중소규모 (수만 ~ 수십만건) | 대규모 (백만 건 이상) |
| 수행 시간 | 짧고 굵게 끝날 때 | 매우 오래 걸릴 떄 |
| 정합성 | 배치 시작 시점의 스냅샷이 중요할 때 | 중간에 데이터가 변해도 상관없거나 정렬이 명확할 떄 |
| 재시작 | 처음부터 다시 시작해야 함 | 실패한 페이지부터 재시작 가능 |