Массовая вставка с Spring Boot и Spring Data JPA не работает - PullRequest
0 голосов
/ 05 июня 2018

Я знаю, что есть много похожих вопросов по этому аргументу, но мне действительно нужно рабочее решение.

Я пытаюсь настроить Spring Boot и Spring Data JPA, чтобы сделать массовую вставку в пакет.

Цель: зафиксировать каждую N-запись , а не каждую запись при выполнении действия repository.save().

То, что я пробовал с тех пор в application.properties:

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

Но безуспешно.Я наблюдал за базой данных, и записи сохранялись в таблицах по одной, а не по 100 на 100, как я настроил.

ОБНОВЛЕНИЕ

Вот реализация:

@Component
public class BulkInsert {

    @Autowired
    MyRepository repository;

    public void process() {

        PodamFactory podamFactory = new PodamFactoryImpl();

        for(int i=0;i<10000;i++) {
            MyEntity myEntity = podamFactory.manufacturePojo(MyEntity.class);
            repository.save(myEntity);
        }

    }
}

Вот сущность:

@Entity
@Table(name="MYTABLE")
@NamedQuery(name="MyEntity.findAll", query="SELECT m FROM MyEntity m")
public class MyEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Column(name="DESCRIPTION")
    private String description;

    @Id
    @Column(name="ID")
    private String id;

    public MyEntity() {
    }

    // getters and setters

}

И хранилище:

public interface MyRepository extends CrudRepository<MyEntity, String> {

}

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

В моем случае массовые вставки не работали даже с этими конфигурациями.

Оказывается, что если объекты используют генератор идентификаторов GenerationType.IDENTITY, Hibernate автоматически отключит пакетные вставки / обновления.

Может быть, это поможет другим.

Источник: http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/

Я использую:

  • MySql 5.6
  • Spring boot 2.1.9
  • JPA и Hibernate
0 голосов
/ 05 июня 2018

Попробуйте изменить свой код следующим образом:

public void process() {

    PodamFactory podamFactory = new PodamFactoryImpl();
    List<MyEntity> myEntities = new ArrayList<>(10000);

    for(int i = 0; i < 10000; i++) {
        myEntities.add(podamFactory.manufacturePojo(MyEntity.class));
    }

    repository.save(myEntities); // for Spring Boot prior 2.0
    // repository.saveAll(myEntities); - for Spring Boot since 2.0
}

PS не забудьте включить spring.jpa.show-sql, чтобы увидеть результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...