Spring Boot MySQL не пакетирует вставки

Я применил почти все решения, опубликованные здесь на SO по этой проблеме, но ничего не сработало.

Мой application.properties:

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?logger=com.mysql.jdbc.log.Slf4JLogger&rewriteBatchedStatements=true&profileSQL=true&autoReconnect=true&useSSL=false
spring.datasource.username=user
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.hibernate.jdbc.batch_size = 100
spring.jpa.hibernate.order_inserts   = true 
spring.jpa.hibernate.order_updates   = true

logging.level.root=info
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5p) %gray(%c{0}::%M) - %m%n

Мой EntityRepository:

@Repository
public interface EntityRepository extends CrudRepository<Entity, Long> { }

Мой сущность:

@Data @Entity
public class Entity {

  @Id
  @GeneratedValue(generator = "generator")
  @GenericGenerator(name = "generator", strategy = "increment")
  private Long id;

  private Long attr;

}

И упрощенный код, вызывающий репозиторий:

int batchSize = 100;
List<Entity> batchEntities = new ArrayList<>();
for(Entity entity : entities) {
  batchEntities.add(entity);
  if (batchEntities.size() >= batchSize) {
    entityRepository.saveAll(batchEntities);
    batchEntities.clear();
  }
}

Что я сделал:

В соответствии с этот ТАК вопрос я включил опцию profileSQL=true, и журнал производит несколько отдельных вставок. Кроме того, я включил глобальное ведение журнала на сервере SQL, и он также производит последовательность отдельных вставок.

В соответствии с это еще один ТАК вопрос и еще один ТАК вопрос я убедился, что batch_size установлен в файле application.properties, и, хотя у меня нет родительско-дочерних отношений, я также пытался использовать order_inserts и order_updates. Кроме того, я включил опцию rewriteBatchedStatements=true и использовал метод saveAll(...).

Я также попытался отказаться от готового CrudRepository и моего собственного, промывая после каждого сохранения batchSize-го.

Ничего из вышеперечисленного не помогло.

spring.jpa.hibernate.order_updates ничего не сделает (то же самое относится и к другим свойствам). Вместо этого используйте spring.jpa.properties.hibernate.order_updates (то же самое относится и к другим настраиваемым свойствам гибернации).
M. Deinum 04.09.2018 10:19

@ M.Deinum Спасибо! Теперь работает отлично. Не могу поверить, что я это пропустил. Хотите переписать свой комментарий в ответ, чтобы я мог его принять?

Rudimentary Joe 04.09.2018 10:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 813
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующие свойства не существуют в Spring Boot.

spring.jpa.hibernate.jdbc.batch_size = 100
spring.jpa.hibernate.order_inserts   = true 
spring.jpa.hibernate.order_updates   = true

Вместо этого для добавления настраиваемых свойств используйте префикс spring.jpa.properties.

spring.jpa.properties.hibernate.jdbc.batch_size = 100
spring.jpa.properties.hibernate.order_inserts   = true 
spring.jpa.properties.hibernate.order_updates   = true

Должен сделать свое дело.

См. Также документацию Spring Boot на как настроить JPA.

Другие вопросы по теме