Как использовать потоки для обработки кусков в потоке записей JPAJAVA

Программисты JAVA общаются здесь
Anonymous
Как использовать потоки для обработки кусков в потоке записей JPA

Сообщение Anonymous »

В Spring Boot 2.7 результаты потоковой передачи обратно из запроса базы данных и обработки их партий с использованием JDBC очень проста: < /p>

Код: Выделить всё

   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.
proccess(chunk);
writeBackToDB(cunk);
// lots more code
}while (rowsReadInThisBatch == myBatchSize);
Таблица базы данных имеет> 1 миллион строк, поэтому мы не можем просто прочитать их все в один объект 1 миллиона строк, так как наши серверы производственных микросервисов имеют только 1 ГБ оперативной памяти. Вместо этого вы должны использовать Lambdas и Java Streams.

Код: Выделить всё

    try(Stream myStream = postRepository.streamByCreatedOnSince(yesterday)) {
myStream.forEach(
....
);
}
Однако Foreach чрезвычайно ограничена, потому что вы не можете использовать нефинальные переменные, и вы не можете реализовать простую логику, которая нам нужна в нашем примере для петли. В идеале не использовать встроенный код Lambda, который трудно проверить отдельно (и трудно понять для экспертов, не связанных с Java)? Дополнительные библиотеки, которых мы хотим избежать. Кроме того, не ясно, прочитали ли их решения весь поток в память, разбивайте его на куски или партии, чего мы хотим избежать из -за очень большого набора данных.


Подробнее здесь: https://stackoverflow.com/questions/796 ... of-records

Вернуться в «JAVA»