Spring Boot 应用程序。批处理在 JpaRepository.saveAll 方法中不起作用
Posted
技术标签:
【中文标题】Spring Boot 应用程序。批处理在 JpaRepository.saveAll 方法中不起作用【英文标题】:Spring Boot Appllication. Batch doesn't work in JpaRepository.saveAll method 【发布时间】:2020-12-29 00:59:18 【问题描述】:有配置的spring boot应用:
spring:
jpa:
show-sql: true
properties:
hibernate:
jdbc:
batch_size: 20
order_inserts: true
order_updates: true
generate_statistics: true
format_sql: true
dialect: org.hibernate.dialect.PostgreSQL10Dialect
default_schema: $SCHEMA
我使用 JpaRepository.saveAll 方法将新数据插入数据库。 但我没有看到批处理工作。
有日志:
Session Metrics
1501300 nanoseconds spent acquiring 1 JDBC connections;
0 nanoseconds spent releasing 0 JDBC connections;
13234500 nanoseconds spent preparing 1013 JDBC statements;
1636949500 nanoseconds spent executing 1013 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;
12971600 nanoseconds spent executing 1 flushes (flushing a total of 1012 entities and 0 collections);
4901200 nanoseconds spent executing 2 partial-flushes (flushing a total of 4 entities and 4 collections)
版本:
-
spring-data-jpa-2.2.6.RELEASE
postgresql-42.2.12
【问题讨论】:
请检查这是否有帮助https://***.com/questions/27697810/hibernate-disabled-insert-batching-when-using-an-identity-identifier-generator/27732138
【参考方案1】:
批处理不适用于 GenerationType.IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
需要使用序列。
例子:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "row_generator")
@SequenceGenerator(name = "row_generator", sequenceName = "db_generator", allocationSize = 1)
private Long id;
【讨论】:
【参考方案2】:几周前我遇到了类似的问题。 我现在只需为事务中的所有实体一个一个地调用 save(...),它就可以按预期工作。
【讨论】:
是的,但有不同的说法。批处理是一个包含许多操作的语句。 Hibernate 会将分开的保存命令合并成批次。以上是关于Spring Boot 应用程序。批处理在 JpaRepository.saveAll 方法中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作
使用 Spring Boot 在 JPA 中访问 MySQL 视图
Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理
使用Spring Boot和JPA批处理 - 对与批处理相关的表使用内存数据源