Проблема в том, что обновления фиксируются в самом конце всего процесса, поскольку это транзакция.
Шаги следующие:
Я читаю данные из большой таблицы, используя поток (адаптивная буферизация, также известная как небуферизованная):
Код: Выделить всё
public void checkActiveItemsFromTheDb() {
itemsRepository.streamAllByIsActive(true).forEach(entity -> {
Integer id = entity.getId();
checkIfItemIsInactiveAndUpdate(id);
});
}
Код: Выделить всё
@Async
protected void checkIfListingIsInactiveAndUpdate(String id) {
ItemView itemView = findBySearchId(id);
Boolean isActive = itemView.getIsActive();
if (isActive == false) {
updateItemService.updateItem(id);
}
}
Как отправить запрос на обновление, пока продолжается адаптивное чтение? Здесь около 50 000 элементов, и лишь некоторые из них нуждаются в обновлении. Весь процесс (чтение и внешняя проверка) занимает около 15 минут. Я просто пытаюсь сделать обновление, не дожидаясь конца. Я пробовал использовать ключевые слова @EnableAsync, @Async, @Transactional, @Transactional(readOnly = true), но они не помогли.
В качестве образца я использую
- Java 25
- Spring Boot 3.5
- Microsoft SQL Server 2025
Подробнее здесь: https://stackoverflow.com/questions/798 ... adaptive-b
Мобильная версия