[英]How to DO Batch Update in Hibernate Effectively
我已經閱讀了許多文章,並發現了一些進行批處理的方法
其中之一是使用flush和clear,下面是代碼
long t1 = System.currentTimeMillis();
Session session = getSession();
Transaction transaction = session.beginTransaction();
try {
Query query = session.createQuery("FROM PersonEntity WHERE id > " + lastMaxId + " ORDER BY id");
query.setMaxResults(1000);
rows = query.list();
int count = 0;
if (rows == null || rows.size() == 0) {
return;
}
LOGGER.info("fetched {} rows from db", rows.size());
for (Object row : rows) {
PersonEntity personEntity = (PersonEntity) row;
personEntity.setName(randomAlphaNumeric(30));
lastMaxId = personEntity.getId();
session.saveOrUpdate(personEntity);
if (++count % 50 == 0) {
session.flush();
session.clear();
LOGGER.info("Flushed and Cleared");
}
}
} finally {
if (session != null && session.isOpen()) {
LOGGER.info("Closing Session and commiting transaction");
transaction.commit();
session.close();
}
}
long t2 = System.currentTimeMillis();
LOGGER.info("time taken {}s", (t2 - t1) / 1000);
在上面的代碼中,我們正在批量處理1000條記錄,並在同一事務中對其進行更新。
只需要進行批處理更新就可以了。
但是我有以下問題要解決:
那么,我們應該如何處理這種情況呢?
我可能的想法/解決方案:
請幫助我獲得更好的解決方案。
您是說這個意思嗎?
事務中正在進行批量更新
同時,另一個線程也開始更新批處理中的其中一個記錄
因此,該批處理將等到點2中的更新完成。 這將導致批處理中的其余記錄也等待。 到目前為止,一切似乎都很好。 但是,這里重要的一點是完成事務是為了“更快”地更新大量記錄。 通常,事務用於確保“一致性/原子性”。 一個人如何設計這部分-一次就快速更新多個記錄,而原子性不是主要標准,而另一線程也請求對批處理中的記錄進行可能的更新
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.