스프링 배치로 일괄 처리를 작성하고 있습니다. 필자는 데이터 원본 (Oracle 데이터베이스)에서 대상 (Kafka 브로커)까지 약 2 000 000 개의 레코드를 이동해야합니다. 나는 ItemReader 나는이 작업을 위해 선택해야하는 주저 해요 :스프링 배치 JdbcCursorItemReader 또는 RepositoryItemReader?
JdbcCursorItemReader : 나는 올바르게 하나에 의해 레코드의 ALL의 결과 집합을 반복 할 것이다 커서, 하나를 엽니 다 이해한다면 , 성능은 문제가되지 않습니다. 후드 데이터베이스에서는 쿼리가 실행될 때 을 만족하는 레코드의 스냅 샷을 유지합니다. 여기서는 절이 사용됩니다.
RepositoryItemReader가 : 덜 확대됨 수 있습니다, 분할 페이징 메커니즘을 기반으로, 각 페이지에 대해 쿼리가 실행됩니다 동안 데이터베이스에 기록 할 수있는 몇 가지 기록을 ommiting의 가능성이있는 같으면, 2 개 000 000 레코드 가져 오기 '는 t는 (내 추론도 맞습니까?) 전자의 경우에 발생
요약 : 그들이에서 쿼리 실행시에 있었던 같은 결과 나는 그 2 개 000 000의 모든 레코드를 보낼 분할 된 방식으로. 이 문제를 너무 과소 평가하고 있습니까? 새로운 기록을 건너 뛰는 것은 업데이트 작업의 향후 처형의 경우에 그렇게 문제가되지 않을 수 있습니까? 아니면 RepositoryItemReader에 관한 내 추론이 올바르지 않습니까?