tgoop.com/BookJava/3855
Create:
Last Update:
Last Update:
🧠 JPA Batch Insert: ускоряем и защищаем от OOM
📌 Настройка Hibernate
Добавьте в application.yml или properties:
spring:
jpa:
properties:
hibernate.jdbc.batch_size: 50 # размер пакета
hibernate.order_inserts: true # группировка INSERT’ов
hibernate.order_updates: true # группировка UPDATE’ов
Это позволит драйверу посылать пачками, а Hibernate — сортировать операции для максимальной эффективности.
💡 Сниппет для batch-пакетов
@Service
@RequiredArgsConstructor
public class OrderService {
private final EntityManager em;
private static final int BATCH_SIZE = 50;
@Transactional
public void saveAll(List<Order> orders) {
for (int i = 0; i < orders.size(); i++) {
em.persist(orders.get(i));
if (i > 0 && i % BATCH_SIZE == 0) {
em.flush();
em.clear(); // освобождаем persistence-context
}
}
em.flush();
em.clear();
}
}
–
flush() выталкивает пакеты в БД,–
clear() освобождает ОЗУ от управляемых сущностей.⚠️ Важные моменты
* GenerationType.IDENTITY отключает batching. Используйте
@SequenceGenerator с allocationSize.* При двусторонних связях (OneToMany) избегайте каскадного сохранения огромных графов — лучше сохранять “плоско” и затем связывать.
* Следите за JDBC-драйвером: не все поддерживают batch-вставки одинаково хорошо.
💡 Совет по мониторингу
Запустите приложение с
-Dorg.hibernate.SQL=DEBUG и -Dhibernate.format_sql=true — вы увидите групповые INSERT вместо множества одиночных.📌 Результат
* Скорость записи растёт в 5–10× (в зависимости от нагрузки).
* Память на стороне приложения остаётся стабильной, без роста Persistence Context.
👉@BookJava
BY Библиотека Java разработчика

Share with your friend now:
tgoop.com/BookJava/3855
