【问题标题】:Bulk insert with Spring Boot and Spring Data JPA not working使用 Spring Boot 和 Spring Data JPA 批量插入不起作用
【发布时间】:2018-11-14 14:24:46
【问题描述】:

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

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

}

【问题讨论】:

  • 你应该提供你的代码你是如何尝试实现这个的......
  • 我只使用了 CrudRepository 接口,并使用 Eclipse 插件生成了@Entities。它可以工作,但它会提交每条记录
  • 只显示你的服务代码...)
  • 我已经用实现的 sn-p 编辑了问题

标签: spring-boot spring-data-jpa bulkinsert


【解决方案1】:

在我的情况下,即使使用这些配置,批量插入也无法正常工作。

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

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

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

我正在使用:

  • MySql 5.6
  • 弹簧靴 2.1.9
  • JPA 和休眠

【讨论】:

    【解决方案2】:

    尝试像这样更改您的代码:

    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?

    【讨论】:

    • 它似乎有效!所以诀窍是只调用一次保存。我以为每次保存都会在持久化之前缓存。
    • 如果你有一个事务正在运行,它应该缓存保存调用。如果您的流程方法周围没有事务,则保存调用本身会打开一个事务,因为存储库方法使用事务性注释。
    • 用spring数据jpamedium.com/@clydecroix/…进行批处理
    • @AlessandroC 你能解释一下这一行吗 myEntities.add(podamFactory.manufacturePojo(MyEntity.class));我遇到了这个问题,我无法理解这一行。
    • @V.Monisha podam 只是一个层,它允许您使用随机值填充 bean,如果您有实际值,则不需要它。
    猜你喜欢
    • 2021-03-09
    • 2018-05-17
    • 2018-07-08
    • 1970-01-01
    • 2020-04-10
    • 2018-01-23
    • 2020-03-18
    • 1970-01-01
    • 2016-10-04
    相关资源
    最近更新 更多