Spring Data JPA saveAll 不进行批量插入
Posted
技术标签:
【中文标题】Spring Data JPA saveAll 不进行批量插入【英文标题】:Spring Data JPA saveAll not doing batch insert 【发布时间】:2020-03-18 23:45:54 【问题描述】:所以我使用了一个简单的 JpaRepository 并调用了 saveAll() 方法。
hibernate.jdbc.batch_size = 500
hibernate.order_inserts = true
hibernate.generate_statistics = true
运行应用程序后:
8045055 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
137189246 nanoseconds spent preparing 1158 JDBC statements;
1417689514 nanoseconds spent executing 1158 JDBC statements;
0 nanoseconds spent executing 0 JDBC batches;
0 nanoseconds spent performing 0 L2C puts;
0 nanoseconds spent performing 0 L2C hits;
0 nanoseconds spent performing 0 L2C misses;
16270990 nanoseconds spent executing 1 flushes (flushing a total of 1158 entities and 0 collections);
0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)
任何人都可以看到 0 执行 JDBC 批处理的原因吗? 另外,我必须指出我的实体有 @GeneratedValue(strategy = IDENTITY) 主键
【问题讨论】:
Hibernate disables insert batching at the JDBC level transparently if you use an identity identifier generator. 你才是真正的 MVP。这应该是公认的答案,但您发表了评论 我已经发布了答案。 ) 也许this我关于批量插入的回答对你来说也会很有趣...... 我在我的实体上使用 UUID 生成器,但我使用 .save() 方法进行非批量插入,但我仍然看到同样的问题? 【参考方案1】:同时设置hibernate.order_updates = true
。
将 org.hibernate.engine.jdbc.batch.internal.BatchingBatch
的记录器更改为 DEBUG 并查看您得到的输出。
【讨论】:
你在哪里设置这个?【参考方案2】:为属性名称添加前缀 spring.jpa.properties。它应该是这样的:
spring.jpa.properties.hibernate.jdbc.batch_size = 500
【讨论】:
【参考方案3】:Hibernate 不使用身份标识符生成器执行插入批处理。 更多信息是here。
【讨论】:
在我的情况下,任何 id 生成策略都不会发生 oracle 插入批处理。是的,我已经设置了属性hibernate.jdbc.batch_size: 100
以上是关于Spring Data JPA saveAll 不进行批量插入的主要内容,如果未能解决你的问题,请参考以下文章
Spring数据JPA存储库saveAll不生成批量插入查询