Выставил hibernate.jdbc.batch_size, ждёшь один батч на 100 строк, а в логах 100 отдельных INSERT. Если ID у сущности такой:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
…то батчинг не работает в принципе. Из официальной доки Hibernate: insert-батчинг на уровне JDBC прозрачно отключается при использовании identity-генератора.
Причина в стратегии write-behind. С IDENTITY сгенерированный ID известен только после выполнения INSERT (через getGeneratedKeys()). А значит Hibernate обязан выполнить вставку немедленно при persist(), и накопить пачку для одного батча уже не может.
Решение — SEQUENCE с оптимизатором pooled / pooled-lo: он резервирует диапазон значений в памяти (одна выборка из последовательности на N строк), ID известен заранее, write-behind и батчинг включаются:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", allocationSize = 50)
private Long id;
MySQL SEQUENCE не имеет, там IDENTITY часто единственный вариант, и батчинг приходится вытягивать отдельными трюками (rewriteBatchedStatements=true + ручные приёмы).
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava