inflearn logo
강의

Course

Instructor

Spring Batch

DB - JdbcCursorItemReader

jdbcCursorReader, jdbcPagingReader 질문

143

hoonseung

34 asked

0

안녕하세요 jdbc 를 통해 데이터를 읽어오는 점에 대해 질문이 있습니다.

@Bean
public ItemReader<Customer> jdbcCursorItemReader() {
    return new JdbcCursorItemReaderBuilder<Customer>()
        .name("jdbcCursorItemReader")
        .fetchSize(10)
        .dataSource(dataSource)
        .sql(
            "select id, firstName, lastName, birthDate from customer where firstName like ? order by lastName, firstName")
        .beanRowMapper(Customer.class)
        .queryArguments("A%")
        .build();
}

여기서 fetchSIze 는 db 에서 한번에 가져올 레코드 수이고

 

@Bean
public ItemReader<Customer> jdbcPagingReader() throws Exception {
    Map<String ,Object> paramMap = new HashMap<>();
    paramMap.put("firstName", "H%");

    return new JdbcPagingItemReaderBuilder<Customer>()
        .name("jdbcPagingReader")
        .dataSource(dataSource)
        .fetchSize(3)
        .pageSize(3)
        .queryProvider(pagingQueryProvider())
        .parameterValues(paramMap)
        .beanRowMapper(Customer.class)
        .build();
}

여기 페이징 방식에는 fetchSize, pageSize 두개를 둘 다 사용할 수 있던데 차이가 정확인 뭔가요? pageSize는 설정 시 쿼리에 Limit 설정 수가 추가되어 나가는 것은 확인했습니다.

spring-boot spring-batch

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.
hoonseung님, jdbcCursorReaderjdbcPagingReader에서 사용되는 fetchSizepageSize의 차이에 대해 설명드리겠습니다.

jdbcCursorReaderjdbcPagingReader 모두 Spring Batch에서 데이터를 읽어올 때 사용할 수 있는 방법이지만, 그 동작 방식이 다릅니다.

  1. JdbcCursorItemReader:

    • fetchSize: 데이터베이스에서 한 번에 가져올 레코드의 수를 지정합니다. 커서 기반으로 데이터를 순차적으로 가져오기 때문에 메모리 효율 측면에서 주의가 필요합니다. fetchSize는 쿼리가 실행될 때 JDBC 드라이버에 커서가 한 번에 가져올 수 있는 행 수를 조정합니다. 그렇지만, 전체 데이터를 순차적으로 가져오기 때문에 대량의 데이터를 다룰 때는 메모리 소모가 많을 수 있습니다.
  2. JdbcPagingItemReader:

    • fetchSize: 내부적으로 사용되는 JDBC의 Fetch Size입니다. 데이터베이스에서 페이지를 가져올 때 사용할 수 있는 선택 사항이며, 어디까지나 JDBC 드라이버에 최적화된 설정입니다.
    • pageSize: 각 페이지에 포함될 레코드 수를 지정합니다. 결과적으로 SELECT ... LIMIT pageSize와 같은 형태로 쿼리가 보내집니다. 이 방식은 대량의 데이터를 처리할 때 메모리를 절약할 수 있습니다. 데이터베이스에서는 pageSize 값에 따라 쿼리가 여러 번 실행되며, 한 페이지씩 데이터를 가져옵니다. 즉, 대량의 데이터라도 메모리 사용을 최소화하며 처리할 수 있는 장점이 있습니다.

종합하자면, jdbcCursorReader는 단순 반복을 통해 데이터를 가져오지만, jdbcPagingReader는 페이지 단위로 나누어 데이터베이스에 여러 번 쿼리를 보내 데이터를 가져옵니다. jdbcPagingReader의 페이징 방식은 메모리 사용량을 줄여 대량 데이터 처리 시 안정성을 제공합니다. pageSize는 전체 데이터의 페이지 크기를 의미하는 반면, fetchSize는 데이터베이스에서 한 번에 가져올 레코드 수를 의미합니다. 이러한 차이를 이해하신다면, 상황에 맞게 알맞은 Reader를 선정하여 사용할 수 있을 것입니다.

추가적인 설명이 필요하시다면 언제든지 질문해 주세요!

참고 URL:
- Spring Data JPA - Reference Documentation

스프링 배치 버전 질문

0

120

1

소스코드가 어디에 있나요?

0

95

2

트랜잭션 예외

0

90

1

질문이 있습니다.

0

128

2

ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문

0

124

2

여러 JOB 설정하는법

0

148

2

강의 자료 다른 방법 있을까요?

0

154

1

JobExecution과 JobExecutionContext와의 관계

0

185

2

특정 job만 실행

1

248

1

Batch 성능 질문

0

151

1

ItemReaderAdapter 종료

0

78

1

[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader

0

178

2

Spring Batch 배포 질문

0

245

2

spring batch 버전

0

235

2

retry count 관련 질문

0

170

2

StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.

0

327

2

jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)

0

233

2

Multithread step과 AsyncItemProcessor

0

201

2

job 재실행

0

250

2

bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)

0

182

1

Multi-threaded-step과 Partitioning 차이 확인

0

172

2

step muti-thread 질문

0

106

1

itemSteam open update close 질문

0

109

1

@JopScope, stepScope 지연 초기화 관련 질문

1

124

1