TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #2292 1.8K
Spring Boot: есть возможность использовать стриминг (Stream<T>) для запросов с большими наборами данных.

Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных

В следующем примере есть приложение с CommandLineRunner, которое сохраняет большой набор пользователей в базу данных, а затем обрабатывает данные через стрим:

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
CommandLineRunner run(UserRepository repo, UserService service) {
return args -> {
// Генерация тестовых данных
for (int i = 1; i <= 10000; i++) {
repo.save(new User("User_" + i));
}

// Обработка через стрим
service.processUsers();
};
}
}


Метод processUsers работает в транзакции и использует метод репозитория streamAllUsers, который возвращает стрим:

@Service
public class UserService {

private final UserRepository repository;

@PersistenceContext
private EntityManager em;

public UserService(UserRepository repository) {
this.repository = repository;
}

@Transactional(readOnly = true)
public void processUsers() {
AtomicInteger counter = new AtomicInteger();

try (Stream<User> stream = repository.streamAllUsers()) {
stream.forEach(user -> {
System.out.println(user.getName());

if (counter.incrementAndGet() % 100 == 0) {
em.clear();
}
});
}
}
}


public interface UserRepository extends JpaRepository<User, Long> {

@Query("SELECT u FROM User u")
Stream<User> streamAllUsers();
}


Важные моменты:

- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через spring.jpa.properties.hibernate.jdbc.fetch_size=100, так как некоторые драйверы могут загрузить всё сразу
- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)

#SpringBoot #JavaDev

👉 Java Portal
  • ❤ 7
  • 👍 2
More from @java_iibrary
  1. Sep 24, 2026Java-разработчики, в чём разница между volatile и synchronized? Многие используют их. Но в…
  2. Sep 23, 2026Готовимся к System Design интервью уровня Middle и Senior Полезный конспект по проектирова…
  3. Sep 23, 2026Java-разработчики, знаете разницу между Shallow Copy и Deep Copy? Вы копируете объект, но…
  4. Sep 22, 2026Java-разработчики: Почему ArrayList увеличивает свою ёмкость примерно на 50%, когда заканч…
  5. Sep 22, 2026Прогрев от Java-бабули 🙂 👉 Java Portal
  6. Sep 21, 2026Шпаргалка по проектированию веб систем System Design 101 Подробное руководство по архитект…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →