如何在springboot中启用插入批处理?

时间:2018-02-12 22:16:23

标签: spring-boot

为父母提供spring-boot:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
</parent>

我使用spring-boot-starter-data-jpa,并面临配置问题。我必须为有点大量写入的应用程序创建代码,但JPA坚持一个接一个地发出插入。在阅读了我所知道的许多问题之后,我应该以某种方式配置它:

#hibernate.jdbc.batch_size=5
#hibernate.order_inserts=true
#hibernate.order_updates=true
#hibernate.jdbc.batch_versioned_data=true
#spring.jpa.hibernate.jdbc.batch_size=5
#spring.jpa.hibernate.order_inserts=true
#spring.jpa.hibernate.order_updates=true
#spring.jpa.hibernate.jdbc.batch_versioned_data=true
spring.jpa.properties.hibernate.jdbc.batch_size=5
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true

但是没有配置似乎是获胜者,设置似乎被忽略了。实体PK是在构造函数中生成的UUID,因此不应该有任何理由使批处理不可用。

我怎么知道他们是否真的被忽略了?好吧,我其实不知道。使用配置:

spring.jpa.show-sql=true

仅显示单个插页,但确定,据称它始终显示此内容。但是,如果一个人启用跟踪日志记录,据称应该有一些来自batcher的日志,解释,他如何批处理语句。嗯,这不存在。登录postgres级别没有显示任何批处理,但其他人解释说,据称它从未显示。在springboot上配置p6spy的努力是徒劳的。

问题: 如何在springboot中配置插入批处理?很抱歉可能会“重复”,但是> 5个答案似乎都没有效果。

我们如何有效地证明,使用了批处理?

1 个答案:

答案 0 :(得分:0)

您可以尝试通过session.setJdbcBatchSize(size)为某个会话显式设置批处理大小,以执行任务 这是一些与MySql 5.6,Hibernate 5.3和Spring Boot 2.0.2兼容的测试示例,而与

之类的全局设置无关
spring.jpa.hibernate.jdbc.batch_size=10 
spring.jpa.hibernate.order_inserts=true 
spring.jpa.hibernate.order_updates=true

测试代码:

@Autowired
private EntityManager em;

    @Commit
    @Test
    public void batchInsertTest() {
        Session session = em.unwrap(Session.class);
        session.setJdbcBatchSize(10);
        for (long i = 0; i < 100; i++) {
            Batch batch = new Batch();
            batch.setId(i);
            batch.setName("batch"+i);
            session.save(batch);
            if (i%10==0) {
                session.flush();
                session.clear();
            }
        }
    }

为了查看批处理是否已经到位,我们需要打开统计信息,这是SpringBoot应用程序中的设置。属性:

logging.level.org.hibernate.stat=DEBUG
spring.jpa.properties.hibernate.generate_statistics=true

它将在提交后生成如下输出:

Session Metrics {
    34700 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    39725440 nanoseconds spent preparing 11 JDBC statements;
    0 nanoseconds spent executing 0 JDBC statements;
    58840328 nanoseconds spent executing 11 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    203702688 nanoseconds spent executing 11 flushes (flushing a total of 100 entities and 0 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
}

您会看到已经准备了11个批次。

插入时非常简单的时间处理度量(基于System.nanoTime())会显示以下图片:50000个条目,带有和不带有size = 1000的批处理

  • 1000个批次:10.5-10.3秒
  • 无批次:18.5-19.3秒。

在我非常老的Intel CPU上,四核9550