Код: Выделить всё
try (PreparedStatement ps = conn.prepareStatement(MY_SQL)) {
ps.setFetchSize(100);
ResultSet rs = ps.executeQuery();
do {
List chunk = new ArrayList();
while (rs.next() && (rowsReadInThisBatch < myBatchSize)) {
MyEntity entity = new MyEntity();
myEntity.setSomeCol(rs.getLong("some_col");
myEntity.setSomeCol2(rs.getLong("some_col2");
chunk.add(entity)
rowsReadInThisBatch++;
}
// lost more code.
process(chunk);
writeBackToDB(cunk);
// lots more code
} while (rowsReadInThisBatch == myBatchSize);
Чтобы сделать это с потоками в JPA, не существует эквивалента rs.next(). Вместо этого вам придется использовать лямбда-выражения и потоки Java.
Есть ForEach:
Код: Выделить всё
try(Stream myStream = postRepository.streamByCreatedOnSince(yesterday)) {
myStream.forEach(
....
);
}
Как мне преобразовать мои старые добрые циклы do и циклы while в потоки Java/лямбда-материалы, чтобы читать и обрабатывать фрагменты, а не обрабатывать каждый по отдельности без разделения на фрагменты? В идеале не использовать встроенный лямбда-код, который сложно тестировать отдельно (и трудно понять для экспертов, не являющихся экспертами по потокам Java)?
Суть в том, что потоки Java не имеют концепции счетчика или фрагментации.
В этой статье: https://www.baeldung.com/java-stream-batch-processing есть несколько очень эзотерических решений, требующих дополнительных библиотек, которых мы хотим избежать. Кроме того, неясно, считывают ли их решения весь поток в память, а затем разбивают его на куски или пакеты, чего мы хотим избежать из-за очень большого набора данных.
Подробнее здесь: https://stackoverflow.com/questions/796 ... of-records
Мобильная версия