簡體   English   中英

如何有效地在休眠中進行批量更新

[英]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條記錄,並在同一事務中對其進行更新。

只需要進行批處理更新就可以了。

但是我有以下問題要解決:

  1. 可能存在某些其他線程(T2)正在訪問同一行集以進行某些運行時更新操作的情況,但是在這種情況下,直到不會提交1000個批處理,T2仍然被卡住

那么,我們應該如何處理這種情況呢?

我可能的想法/解決方案:

  1. 我認為我們可以在不同的會話中進行更新,例如說50小批
  2. 對Update使用不同的Stateless連接並一次提交事務,但是當一千個完成時關閉會話。

請幫助我獲得更好的解決方案。

您是說這個意思嗎?

  1. 事務中正在進行批量更新

  2. 同時,另一個線程也開始更新批處理中的其中一個記錄

  3. 因此,該批處理將等到點2中的更新完成。 這將導致批處理中的其余記錄也等待。 到目前為止,一切似乎都很好。 但是,這里重要的一點是完成事務是為了“更快”地更新大量記錄。 通常,事務用於確保“一致性/原子性”。 一個人如何設計這部分-一次就快速更新多個記錄,而原子性不是主要標准,而另一線程也請求對批處理中的記錄進行可能的更新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM