Добрый день.
Читать все данные из БД разом в
List<Foo>
или любую другую коллекцию не самая лучшая идея.
Соответственно, можно вместо коллекций использовать стримы.
Т.е. Получить
Stream<Foo>
Пример,
FooRepository {
@QueryHints(value = {
@QueryHint(name = HINT_FETCH_SIZE, value = "1000"),
@QueryHint(name = HINT_CACHEABLE, value = "false"),
@QueryHint(name = READ_ONLY, value = "true")
})
@Query(value = "SELECT DISTINCT f FROM Foo f")
@Transactional(readOnly = true)
Stream<Foo> findFoos();
}
Ну а дальше остается распараллелить стрим при помощи
parallelStream()
И произвести необходимые операции. Например, вызвать метод
map()
и в конце сохранить...
Если нужно данную операцию производить периодически, то к методу, который будет производить операцию, добавьте
@Async
и используйте
@Scheduled
(или возможности Spring Batch, Spring Quartz)
Для более подробного ответа нужно больше информации.