#spring #spring-batch #batch-processing
#весна #весенний пакет #пакетная обработка
Вопрос:
Я использую JpaPagingItemReader с пакетным заданием Spring для чтения данных из базы данных. У меня есть требование, согласно которому я могу записывать только 10 тыс. записей на внешний сервер при каждой попытке. Я установил размер блока и размер страницы равными 10000. Поможет ли это читать, обрабатывать и записывать только 10 тыс. записей при каждой попытке, пока JpaPagingItemReader не будет исчерпан с ответом null и все данные из БД будут прочитаны? Я запутался между значениями Pagesize и setMaxItemCount. Какой метод обеспечит чтение 10 тыс. записей из базы данных?
Этап пакетной настройки:
public Step step1(StepBuilderFactory stepBuilderFactory, @Qualifier("itemReader") ItemReader<BatchRecords> ir,
@Qualifier("itemProcessor") ItemProcessor<BatchRecords, Map<String, Object>> ip,
@Qualifier("itemWriter") ItemWriter<Map<String, Object>> iw) throws Exception {
logger.info("Step1");
return stepBuilderFactory.get("step1").<BatchRecords, Map<String, Object>>chunk(10000).reader(ir).processor(ip)
.writer(iw).build();
}
ItemReader:
@Bean(destroyMethod="")
@StepScope
public JpaPagingItemReader<BatchRecords> itemReader(){
Map<String, Object> dates = batchUtil.dateFormat();
String startDate = (String) dates.get("StartDate");
String endDate = (String) dates.get("EndDate");
logger.info("Batch settlement Start date : {}, End Date: {}",startDate,endDate);
JpaPagingItemReader<BatchRecords> reader = new JpaPagingItemReader<BatchRecords>();
reader.setEntityManagerFactory(localContainerdbEntityManagerFactory.getNativeEntityManagerFactory());
reader.setQueryString("select b from BatchRecords b where b.status = 'O' and b.ordTimestamp between '" startDate "' and '" endDate "' ");
reader.setPageSize(10000);
// reader.setMaxItemCount(50*reader.getPageSize());
try {
reader.afterPropertiesSet();
} catch (Exception e) {
logger.error("Exception in paging Item reader: " e.getMessage());
}
return reader;
}```
Ответ №1:
Вам нужно использовать maxItemCount
, если вы хотите ограничить общее количество элементов для чтения. Я думаю, что еще лучше установить ограничение в вашем SQL-запросе. PageSize
сообщит читателю, сколько элементов для чтения на каждой странице (это не ограничение на общее количество элементов, а ограничение на количество элементов для чтения при запросе новой страницы).
Комментарии:
1. Атрибут maxItemCount ненадежен на многопоточном этапе Spring Batch. Похоже, что он извлекает больше данных, чем запрошенный maxItemCount.