작성
·
31
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 설정 수가 추가되어 나가는 것은 확인했습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
hoonseung님, jdbcCursorReader
와 jdbcPagingReader
에서 사용되는 fetchSize
와 pageSize
의 차이에 대해 설명드리겠습니다.
jdbcCursorReader
와 jdbcPagingReader
모두 Spring Batch에서 데이터를 읽어올 때 사용할 수 있는 방법이지만, 그 동작 방식이 다릅니다.
JdbcCursorItemReader:
fetchSize
: 데이터베이스에서 한 번에 가져올 레코드의 수를 지정합니다. 커서 기반으로 데이터를 순차적으로 가져오기 때문에 메모리 효율 측면에서 주의가 필요합니다. fetchSize
는 쿼리가 실행될 때 JDBC 드라이버에 커서가 한 번에 가져올 수 있는 행 수를 조정합니다. 그렇지만, 전체 데이터를 순차적으로 가져오기 때문에 대량의 데이터를 다룰 때는 메모리 소모가 많을 수 있습니다.JdbcPagingItemReader:
fetchSize
: 내부적으로 사용되는 JDBC의 Fetch Size입니다. 데이터베이스에서 페이지를 가져올 때 사용할 수 있는 선택 사항이며, 어디까지나 JDBC 드라이버에 최적화된 설정입니다.pageSize
: 각 페이지에 포함될 레코드 수를 지정합니다. 결과적으로 SELECT ... LIMIT pageSize
와 같은 형태로 쿼리가 보내집니다. 이 방식은 대량의 데이터를 처리할 때 메모리를 절약할 수 있습니다. 데이터베이스에서는 pageSize
값에 따라 쿼리가 여러 번 실행되며, 한 페이지씩 데이터를 가져옵니다. 즉, 대량의 데이터라도 메모리 사용을 최소화하며 처리할 수 있는 장점이 있습니다.종합하자면, jdbcCursorReader
는 단순 반복을 통해 데이터를 가져오지만, jdbcPagingReader
는 페이지 단위로 나누어 데이터베이스에 여러 번 쿼리를 보내 데이터를 가져옵니다. jdbcPagingReader
의 페이징 방식은 메모리 사용량을 줄여 대량 데이터 처리 시 안정성을 제공합니다. pageSize
는 전체 데이터의 페이지 크기를 의미하는 반면, fetchSize
는 데이터베이스에서 한 번에 가져올 레코드 수를 의미합니다. 이러한 차이를 이해하신다면, 상황에 맞게 알맞은 Reader를 선정하여 사용할 수 있을 것입니다.
추가적인 설명이 필요하시다면 언제든지 질문해 주세요!