Батчевая загрузка (batching) позволяет выполнять несколько операций за один запрос к базе данных.
Батчевая загрузка по умолчанию отсутствует в Spring JDBC:
В базовой конфигурации Spring JDBC метод saveAll() не использует батчевую загрузку при сохранении массива объектов. Это означает, что объекты будут сохраняться по порядку, по одному запросу на каждый объект. Такой подход может быть крайне неэффективным, особенно если речь идет о больших объемах данных. Например, если вам нужно сохранить тысячи объектов, без использования батчевой загрузки будет выполнено такое же количество отдельных SQL-запросов.
Поддержка батчевой загрузки в Spring JDBC
Тем не менее, Spring JDBC поддерживает батчевую загрузку, и в самом простом варианте для ее активации требуется лишь минимальная настройка. Для этого достаточно добавить в конфигурационные файлы вашего проекта следующие свойства:
hibernate.jdbc.batch_size: это свойство указывает Hibernate, сколько операций он должен сгруппировать в одном батче. Например, значение 50 означает, что каждые 50 операций вставки или обновления будут объединены в один батч.
hibernate.order_inserts: это свойство указывает Hibernate упорядочить операции вставки по типу сущности, что может улучшить производительность.
Пример конфигурации в application.properties или application.yml:
hibernate.jdbc.batch_size=50
hibernate.order_inserts=true
Эти параметры позволяют включить базовую поддержку батчевой загрузки в Spring JDBC и Hibernate.
Добавление конфигураций в application.properties не всегда приводит к ожидаемому результату. Чтобы убедиться, что свойства применились, можно включить отображение SQL-запросов, добавив в настройки spring.jpa.show-sql=true. Это позволит проследить, какие запросы генерирует Hibernate. Если в логах отображается один запрос с несколькими значениями, то батчевая загрузка работает корректно. Если же запросов несколько, возможно, потребуется предпринять дополнительные шаги
Проблема с генератором типа IDENTITY
Hibernate не выполняет пакетную вставку с генератором типа IDENTITY. Это связано с тем, что при использовании IDENTITY база данных генерирует значение идентификатора во время вставки каждой записи, что мешает объединению операций вставки в батч.
Чтобы использовать батчевую загрузку, рекомендуется выбрать другой тип генератора идентификаторов, например SEQUENCE или TABLE, которые позволяют генерировать идентификаторы вне контекста конкретной операции вставки и тем самым поддерживают объединение операций в батч.
Может быть такое, что смена генератора тоже не помогает.
В таком случае можно попробовать переписать запрос при помощи JdbcTemplate, который поддерживает батчевую загрузку. Подробнее, про то, как это сделать можно прочитать здесь: [Spring JDBC Batch Inserts](https://www.baeldung.com/spring-jdbc-batch-inserts)