首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring Data JPA HIbernate批插入速度较慢

Spring Data JPA HIbernate批插入速度较慢
EN

Stack Overflow用户
提问于 2016-02-11 21:23:32
回答 1查看 9.9K关注 0票数 2

我使用Spring Data、Spring Boot和Hibernate作为JPA提供程序,并希望提高批量插入的性能。

我引用此链接以使用批处理:

http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch15.html

这是我的代码和用于插入批处理实验的application.properties。

我的服务:

代码语言:javascript
复制
    @Value("${spring.jpa.properties.hibernate.jdbc.batch_size}")
    private int batchSize;

    @PersistenceContext
    private EntityManager em;

    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public SampleInfoJson getSampleInfoByCode(String code) {
//        SampleInfo newSampleInfo = new SampleInfo();
//        newSampleInfo.setId(5L);
//        newSampleInfo.setCode("SMP-5");
//        newSampleInfo.setSerialNumber(10L);
//        sampleInfoDao.save(newSampleInfo);
        log.info("starting... inserting...");
        for (int i = 1; i <= 5000; i++) {
            SampleInfo newSampleInfo = new SampleInfo();
//            Long id = (long)i + 4;
//            newSampleInfo.setId(id);
            newSampleInfo.setCode("SMPN-" + i);
            newSampleInfo.setSerialNumber(10L + i);
//            sampleInfoDao.save(newSampleInfo);
            em.persist(newSampleInfo);
            if(i%batchSize == 0){
                log.info("flushing...");
                em.flush();
                em.clear();
            }
        }

与批处理相关的application.properties的一部分:

代码语言:javascript
复制
spring.jpa.properties.hibernate.jdbc.batch_size=100
spring.jpa.properties.hibernate.cache.use_second_level_cache=false
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true

实体类:

代码语言:javascript
复制
@Entity
@Table(name = "sample_info")
public class SampleInfo implements Serializable{

    private Long id;
    private String code;
    private Long serialNumber;

    @Id
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "sample_info_seq_gen"
    )
    @SequenceGenerator(
            name = "sample_info_seq_gen",
            sequenceName = "sample_info_seq",
            allocationSize = 1
    )
    @Column(name = "id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "code", nullable = false)
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Column(name = "serial_number")
    public Long getSerialNumber() {
        return serialNumber;
    }

    public void setSerialNumber(Long serialNumber) {
        this.serialNumber = serialNumber;
    }
}

运行上面的批量插入5000行的服务需要30到35秒才能完成,但如果注释以下行:

代码语言:javascript
复制
if(i%batchSize == 0){
    log.info("flushing...");
    em.flush();
    em.clear();
}

插入5000行只需要5到7秒,比批处理模式更快。

为什么在使用批处理模式时速度会变慢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-12 15:25:22

这是因为EntityManager不会立即将数据持久化到数据库中。当您调用flush()时,数据将被持久化。当您注释这些行时,EntityManager根据flush-mode参数刷新数据,直接调用flush告诉EntityManager在数据库中执行查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35340530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档