Мне нужно обновить несколько записей.Я не могу выполнить массовый запрос на обновление по критериям, потому что у нас есть правило, что для каждого изменения БД мы должны отправлять сообщение брокеру сообщений.Поэтому мне нужно обновить сущности один за другим .
Я использую Spring Data Repository.Я могу сделать это, выполняя постраничные запросы и обновляя элементы на страницах.
https://www.baeldung.com/spring-data-repositories
@Service
class MyEntityService {
MyEntityRepository myEntityRepository; // extends PagingAndSortingRepository<MyEntity, ObjectId>
updateMultipleEntities(UpdateRules updateRules) {
Criteria criteria = buildCriteria(updateRules);
long totalrecords = myEntityRepository.count(criteria);
long totalUpdateCound = 0;
// LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE
while (totalUpdateCound < totalrecords) {
Page page = myEntityRepository.findAll(buildPageble(totalUpdateCound, criteria));
processElementsFromPage(page);
}
}
}
Другим решением является потоковая передача всех элементов и их обновление.Это выглядит проще.
@Service
class MyEntityService {
MyEntityRepository myEntityRepository; // extends CrudRepository<MyEntity, ObjectId>
updateMultipleEntities(UpdateRules updateRules) {
Criteria criteria = buildCriteria(updateRules);
// LET US ASSUME THAT NUMBER OF RECORDS DOES NOT CHANGE
myEntityRepository.streamAll(criteria).forEach(element -> processElement(element, updateRules));
}
}
Есть ли недостатки у решения, использующего streamAll(criteria)
?Как я понимаю, было бы полезно использовать постраничные запросы, если мне нужно иметь нумерацию страниц в пользовательском интерфейсе.Однако как насчет моего случая, когда мне нужно обрабатывать элементы один за другим.
Обновление
http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html
Пример того, почему потоковые результаты могут повысить производительность.Тем не менее, он показывает только только для чтения случаев.