Как использовать потоки для обработки кусков в потоке записей 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);
< /code>
Таблица базы данных имеет> 1 миллион строк, поэтому мы не можем просто прочитать их все в один объект 1 миллиона строк, так как наши серверы производственных микросервисов имеют только 1 ГБ оперативной памяти.  В приведенном выше примере у нас только когда -либо имели записи MyBatchSize в RAM, и нам нужно только сделать вставки Total/MyBatchSize в базу данных (не одна вставка для каждой записи, которая приведет к 1 миллиона поездок в DB)
для выполнения потоков в JPA, нет rs.next () 
. Вместо этого вы должны использовать Lambdas и Java Streams.

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

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

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

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