Spring Data JPA配置order_inserts=true后save方法也批量插入是否正常?
关于单次调用Spring Data JPA
save()方法触发批量插入的问题解答 这个现象属于完全正常的情况,核心由Hibernate的批量执行逻辑和你配置的参数特性决定,具体原因如下:
- Hibernate的批量插入是基于持久化上下文(Session)的缓存队列实现的,和调用
save()还是saveAll()没有直接绑定关系。saveAll()本质只是遍历入参集合循环调用save(),本身没有额外的批量优化逻辑。 - 单次调用
save()时,Hibernate只会把实体暂存到当前Session的一级缓存中,不会立刻发送SQL到数据库。等到Session触发flush操作的时机(比如事务提交、主动调用flush()方法、执行查询操作前),才会统一处理缓存中所有待执行的写入操作。 - 你配置的
spring.jpa.properties.hibernate.order_inserts=true会让Hibernate在flush前对所有待插入的实体按类型排序,把同类型实体的插入操作集中到一起,结合spring.jpa.properties.hibernate.jdbc.batch_size配置的批量大小,将多条单插入语句合并为批量插入语句执行,自然就会观测到批量插入的效果。
额外注意事项
如果要让Hibernate批量插入机制完全生效,还需要满足两个前置条件:
- 数据库驱动支持批量插入,例如MySQL需要在JDBC连接串中添加
rewriteBatchedStatements=true参数才会真正执行批量SQL - 实体主键不能使用
IDENTITY自增策略,自增主键需要插入时立刻返回主键值,会打断批量逻辑,建议使用序列、UUID或其他预生成主键的策略
内容的提问来源于stack exchange,提问作者ashley
相关产品推荐
相关产品推荐

