#spring-boot #hibernate #spring-data-jpa #pagination
#весенняя загрузка #спящий режим #spring-data-jpa #разбивка на страницы
Вопрос:
Я создал цикл для получения результатов в разбивке на страницы. Но программа всегда пропускает размер страницы. Например, если размер страницы равен двум, а данные [1,2,3,4,5,6,7], я получаю [1,2], затем [5,6] . [3,4] теряется. Почему это так?
@Override
@Transactional
public void reprocessMultipleTransactions(List<Long> txnEntryIds) {
loggerReprocess.info("Multiple transaction :{}", txnEntryIds);
Pageable pageRequest = new PageRequest(0, 10);
Page<TransactionEntry> transactionEntry = transactionEntryService.findByTransactionEntryIdsWithLock(txnEntryIds, pageRequest);
while(!transactionEntry.getContent().isEmpty()){
pageRequest = pageRequest.next();
transactionEntryService.saveTxnEntries(transactionEntry.getContent());
transactionEntry = transactionEntryService.findByTransactionEntryIdsWithLock(txnEntryIds, pageRequest);
}
}
Функция выглядит так:
@Override
public Page<TransactionEntry> findByTransactionEntryIdsWithLock(List<Long> txnEntryIds, Pageable page) {
Page<TransactionEntry> transactionEntryPage = bankTransactionEntryRepository.findByIdsWithLock(txnEntryIds, DateTimeUtil.subtractTimeInMinutes(fixedDelayInMinutes), page);
log.info("TXN ENTRY:{}", transactionEntryPage.getContent().stream()
.map(TransactionEntry::getId)
.collect(Collectors.toList()));
if(Objects.nonNull(TransactionEntryPage.getContent()) amp;amp; TransactionEntryPage.hasContent()){
List<Long> ids = transactionEntryPage.getContent()
.stream()
.map(TransactionEntry::getId)
.collect(Collectors.toList());
log.info("Reprocess: transaction enry ids :{}", ids);
transactionEntryRepository.saveLastModifiedDate(ids, new Date());
}
return transactionEntryPage;
}
Ниже приведен журнал, который я получаю:
Reprocess - Multiple transaction :[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574, 103434575, 103434596, 103434602, 103434606, 103434607, 103434610, 103434611, 103434613, 103434620, 103434644, 103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705, 103434706, 103434712, 103434713, 103434718, 103434720, 103434724, 103434768, 103434769, 103434778, 103434784, 103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858, 103434859, 103434869, 103434872, 103434878, 103434882, 103434887, 103434888, 103434891, 103434915, 103434916]
10:00:00.304 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574]
10:00:00.305 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess: transaction enry ids :[103434523, 103434524, 103434525, 103434527, 103434569, 103434570, 103434571, 103434572, 103434573, 103434574]
10:00:00.429 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705]
10:00:00.429 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess: transaction enry ids :[103434646, 103434659, 103434666, 103434670, 103434676, 103434697, 103434699, 103434700, 103434703, 103434705]
10:00:00.546 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - TXN ENTRY:[103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858]
10:00:00.546 [task-scheduler-2] INFO c.e.s.t.t.b.TransactionEntryServiceImpl - Reprocess: transaction enry ids :[103434785, 103434786, 103434792, 103434794, 103434795, 103434798, 103434800, 103434821, 103434823, 103434858]
Комментарии:
1. Могу ли я узнать причину, по которой вы все усложняете. Почему бы вам не получить всю необходимую транзакцию за один раз, вызвав PageRequest = new PageRequest(0, целое число. MAX_VALUE); какая-либо конкретная причина для извлечения его постранично, а затем с использованием цикла while?
2. Я не хочу блокировать все данные.
3. Вы имеете в виду, что хотите получить все записи за один раз, чтобы избежать блокировки таблицы?
4. да, сэр. Я хотел не блокировать всю таблицу