web-dev-qa-db-fra.com

Insertion en vrac avec Spring Boot et Spring Data JPA ne fonctionne pas

Je sais qu'il y a beaucoup de questions similaires sur cet argument, mais j'ai vraiment besoin d'une solution de travail.

J'essaie de configurer Spring Boot et Spring Data JPA afin de faire une insertion en bloc dans un lot.

La cible est: valider chaque N-enregistrements, pas tous les enregistrements individuels lors de l'action repository.save().

Ce que j'ai essayé depuis maintenant dans le 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

Mais sans succès. J'ai surveillé la base de données et les enregistrements sont conservés dans les tableaux un par un, pas 100 par 100 comme je l'ai configuré.

METTRE À JOUR

Voici l'implémentation:

@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);
        }

    }
}

Voici l'entité:

@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

}

Et le référentiel:

public interface MyRepository extends CrudRepository<MyEntity, String> {

}
5
Alessandro C

Essayez de changer votre code comme ceci:

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
}

P.S. n'oubliez pas d'activer spring.jpa.show-sql pour voir le résultat

0
Cepr0

Dans mon cas, les inserts en vrac ne fonctionnaient pas, même avec ces configurations.

Il s'avère que si les entités utilisent GenerationType.IDENTITY générateur d'identifiant, Hibernate désactivera silencieusement les insertions/mises à jour par lots.

Peut-être que cela aidera les autres.

Source: http://kyriakos.anastasakis.net/2015/06/12/batch-inserts-with-spring-data-and-mysql/

J'utilise:

  • MySql 5.6
  • Spring boot 2.1.9
  • JPA & Hibernate
3
Vetras