JPA 批量操作性能优化配置
规则说明
本项目使用 Spring Data JPA 进行数据库操作,为提升批量插入和更新的性能,需要启用 Hibernate 的批处理功能。
配置项
以下配置应添加到 application.properties 文件中:
properties
# ========== JPA 批量操作性能优化 ==========
# 批量插入时每次批量的大小(默认30)
spring.jpa.properties.hibernate.jdbc.batch_size=1000
# 强制按插入顺序执行更新
spring.jpa.properties.hibernate.order_updates=true
# 对插入语句进行排序,提高批处理效率
spring.jpa.properties.hibernate.jdbc.order_inserts=true
配置说明
| 配置项 | 建议值 | 说明 |
|---|---|---|
| hibernate.jdbc.batch_size | 1000 | 每次批量插入/更新的记录数。值越大,内存占用越高,但批量效率更高 |
| hibernate.order_updates | true | 强制按插入顺序执行更新,防止并发更新导致的数据不一致 |
| hibernate.order_inserts | true | 对插入语句进行排序,提高批处理效率 |
应用范围
此配置适用于以下场景:
- 批量插入 - 一次插入多条记录(如批量创建用户消息、合同审批节点等)
- 批量更新 - 一次更新多条记录(如批量删除消息、更新审批状态等)
- 大数据量操作 - 处理大量数据时的性能优化
注意事项
-
内存占用
- batch_size 设置过大会增加内存占用
- 建议根据实际数据量和服务器内存情况调整
-
事务边界
- 批量操作应在同一事务内完成
- 使用 @Transactional 注解确保事务一致性
-
测试验证
- 修改配置后,测试批量操作的执行结果
- 确认数据正确性和性能提升
相关业务场景
合同审批流程创建
java
// 批量创建审批节点
List<ContractWorkFlow> workFlowNodes = new ArrayList<>();
// ... 添加节点
contractWorkFlowMapper.saveAll(workFlowNodes); // 使用批量插入
消息批量删除
java
// 批量删除审批消息
List<Message> messages = messageMapper.findByBizIdAndIsDeleted(...);
for (Message message : messages) {
message.setIsDeleted(StatusEnum.Del.getStatus());
// ...
}
messageMapper.saveAll(messages); // 使用批量更新
性能对比
| 场景 | 未启用批量 | 启用批量(batch_size=1000) |
|---|---|---|
| 插入1000条记录 | ~5000-10000ms | ~1000-2000ms |
| 更新1000条记录 | ~3000-8000ms | ~3000-600ms |