java - 如何使用 JpaRepository 使用动态 batch_size 进行批量插入,即 batch_size 未知
问题描述
我正在使用 java spring boot API,我需要在我的数据库中插入大量数据。我知道我怎么能做到这一点。
要使用 Sring Boot 和 Spring Data JPA 进行批量插入,您只需要两件事:
- 设置选项
spring.jpa.properties.hibernate.jdbc.batch_size = 50
- 使用
saveAll()
你的 repo 方法和准备插入的实体列表。
我想知道的是如何实现动态批处理大小,即在某些类中,我只需要保存/插入 5 到 10 条记录,而在某些类中,这个数字可能是 200 到 500 条或更多记录。
现在,我怎样才能实现这个动态 batch_size 选项。
解决方案
您不能在运行时batch_size
仅通过使用EntityManager
AP Ioption 来动态更改它,但您可以进行某种控制:
1)将batch_size设置为最高期望值(即500)
2)设置这些道具是为了让hibernate不要尝试使用之前完成的save/update
语句。
hibernate.order_inserts=true
hibernate.order_updatest=true
3)使用save
代替saveAll
。循环遍历您的列表并刷新与正在保存的类相关的每次次数:
int = flushAfterThisNumber = 10;
for ( int i=0; i<entities.length; i++ ) {
session.save(entities[i]);
if ( i % flushAfterThisNumber == 0 ) {
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
更新
EntityManager
有一种可能的解决方法,但您需要创建一个自定义存储库,以便您能够注入Session
一个batch_size
.
public class CustomerRepositoryImpl implements CustomCustomerRepository {
@PersistenceContext
private EntityManager em;
@Override
public void saveAllInBatch(List<Ent> entities, int batchSize) {
Session session = em.unwrap(Session.class);
session.setJdbcBatchSize(batchSize);
em.saveAll(entities);
}
}
推荐阅读
- ios - 如何在 UIPageViewControllers 之间快速传递数据?
- wso2 - wso2 api 管理器,可选身份验证 (v1.9)
- javascript - 使用 PHP Curl 显示 JSON API 数据;我可以改用 Javascript 吗?
- java - 我正在尝试创建一个将 opps_score 或 bets_score 加 1 的函数,但是当我打印结果时会打印默认值
- python - 将openpyxl格式从文本设置为数字
- netcat - 将 TCP 连接桥接到 UDP(双向)
- javascript - 找出 .map() 方法
- python - pyttsx3 口语之间的不同时间
- wherescape-red - 在 Wherescape RED 中查看元数据
- microsoft-graph-api - Microsoft Graph API 通过 joinUrl 获取在线会议