在Spring Boot和Spring Data JPA不工作的情况下进行大容量插入

epggiuax  于 2022-10-04  发布在  Spring
关注(0)|答案(3)|浏览(201)

我知道关于这一论点有很多类似的问题,但我真的需要一个可行的解决方案。

我正在尝试配置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

但没有成功。我监视了数据库,并将记录逐个持久化到表中,而不是像我配置的那样按100x100保存。

更新

具体实现如下:

@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> {

}
11dmarpk

11dmarpk1#

在我的例子中,即使使用这些配置,批量插入也不起作用。

原来,如果实体使用GenerationType.IDENTITY标识符生成器,Hibernate将静默禁用批插入/更新。

或许这会对其他人有所帮助。

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

我正在使用:

  • MySQL 5.6
  • 春靴2.1.9
  • JPA和Hibernate
3vpjnl9f

3vpjnl9f2#

尝试按如下方式更改代码:

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
}

附言:别忘了打开spring.jpa.show-sql查看结果

更新

也请查看我关于大容量插入的另一个答案:How to do bulk (multi row) inserts with JpaRepository?

disho6za

disho6za3#

由于MySQL不支持Sequeness,并且为GenerationType.IDENTITY禁用了Hibernate Batch Insert,因此AUTO在您的实体类中手动生成序列:

@Id
@GeneratedValue(generator = "voucher_sequence")
@GenericGenerator(name = "voucher_sequence",strategy = "increment")

相关问题