为父母提供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个答案似乎都没有效果。
我们如何有效地证明,使用了批处理?
答案 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的批处理
在我非常老的Intel CPU上,四核9550