Spring Boot+Hibernate/JPA批量更新不生效问题排查求助
问题排查与解决方案
一、现有配置问题排查
- 主键生成策略限制(仅影响新增场景)
你当前实体类主键使用GenerationType.IDENTITY自增策略,Hibernate默认无法对该主键策略的新增实体启用批量操作:因为IDENTITY策略需要执行插入语句后才能获取主键值,Hibernate无法在语句执行前攒够batch_size对应的批量请求,只能单条执行。
如果是更新已有实体的场景,该策略不会影响批量更新生效,可跳过本条排查。
- 主键生成策略限制(仅影响新增场景)
- 缺少事务包裹
saveAll方法要实现批量操作,必须放在同一个事务中执行,如果你的Service方法没有加@Transactional注解,每一条实体保存都会开启独立事务,Hibernate无法攒批量请求,自然只会单条执行。
- 缺少事务包裹
- 新增场景缺少对应配置
如果你当前操作是新增实体而不是更新已有实体,你现有的配置只有更新相关的批量参数,缺少插入批量配置,需要补充:
- 新增场景缺少对应配置
spring.jpa.properties.hibernate.jdbc.order_inserts = true
- 批量请求类型不统一
Hibernate只会将相同实体类型的操作合并为批量请求,如果你的待处理列表中混了其他类型的实体、或者夹杂了查询操作,会打断批量请求的攒批逻辑,导致最终单条执行。
- 批量请求类型不统一
二、AS400 JDBC驱动(jt400)批量支持说明
AS400的官方JDBC驱动(IBM Toolbox for Java/JT400)有类似reWriteBatchedInserts的批量重写参数,配置方式如下:
在数据源URL中添加enableBatchInserts=true参数,开启驱动层的批量操作重写,示例URL:
spring.datasource.url=jdbc:as400://localhost/;enableBatchInserts=true;batchParameterThreshold=30
参数说明:
enableBatchInserts=true:开启驱动层的批量插入重写,会把Hibernate提交的批量插入请求合并为单条多行插入语句,大幅提升性能batchParameterThreshold:设置批量重写的参数阈值,建议和你配置的batch_size保持一致即可
注意事项:需要使用9.5以上版本的JT400驱动,避免低版本不支持enableBatchInserts参数。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

