本文介紹了將實(shí)體批量插入數(shù)據(jù)庫(kù)(Quarkus、Hibernate)的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
首先:我不習(xí)慣Quarkus或Hibernate(我?guī)缀醵际?Net)
問(wèn)題:
我的服務(wù)收到一個(gè)大約10K的列表(我猜這是最常見(jiàn)的數(shù)字)。
這是通過(guò)資源終結(jié)點(diǎn)完成的,它需要+10秒才能完成,遠(yuǎn)遠(yuǎn)超過(guò)10秒。并且服務(wù)沒(méi)有響應(yīng)。
*Endpoint -> Service/Business -> DAO*
@Override
public void create(FooBusiness foo) {
var statuses = new ArrayList<StatusDto>();
for(var i = 1; i < foo.getFromList().size(); i++){
var bar = foo.getFromList().get(i);
statuses.add(new StatusDto(bar.x, bar.y));
}
statusDao.create(statuses);
}
statusDao.Create()用@Transactional
注釋:
DAO為@ApplicationScoped
此EM為:
@PersistenceContext
EntityManager entityManager;
statusDao.Create():
@Transactional
public List<StatusDto> create(List<StatusDto> dto) {
for(var i = 0; i < dto.size(); i++){
var status = dto.get(i);
status.setCreatedTimestamp(LocalDateTime.now());
entityManager.persist(status);
}
entityManager.flush();
return dto;
}
我已經(jīng)閱讀了很多關(guān)于這方面的帖子,其中很多都建議使用此屬性,并將Persistent循環(huán)拆分為與批處理大小相同:
quarkus.hibernate-orm.jdbc.statement-batch-size
問(wèn)題是,當(dāng)我將它添加到應(yīng)用程序中時(shí),我得到了這個(gè)涂色:
無(wú)法解析配置項(xiàng)‘Statement-Batch-Size’
我花了幾乎一天的時(shí)間試圖找到如何加快速度的解決方案,這里有什么明顯的遺漏嗎?
和/或:
我是否可以將從service
到dao
的調(diào)用包裝在某種魔法火中,并忘記Quarkus或Vert.x中內(nèi)置的調(diào)用?
推薦答案
Hibernate將您持久化的所有實(shí)體保留在持久化上下文中,因此您將獲得越來(lái)越多的內(nèi)存,這可能會(huì)導(dǎo)致較差的性能。如果您不再像看起來(lái)那樣需要這些實(shí)體,您可以分批刷新和清除它們,例如50個(gè)項(xiàng)目。
for (var i = 0; i < dto.size();) {
var status = dto.get(i);
status.setCreatedTimestamp(LocalDateTime.now());
entityManager.persist(status);
i++;
if ((i % 50) == 0) {
entityManager.flush();
entityManager.clear();
}
}
entityManager.flush();
這篇關(guān)于將實(shí)體批量插入數(shù)據(jù)庫(kù)(Quarkus、Hibernate)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,