簡體   English   中英

在Hibernate / JPA中使用批處理插入

[英]Using batch insert in Hibernate/JPA

好吧,我正在嘗試在JPA中進行批量插入,但是我認為這不起作用。

我的方法是這樣的:

public void saveBatch(List<? extends AbstractBean> beans) {
    try {
        begin();
        logger.info("Salvando em batch " + beans.size() + " bean(s)");
        for (int i = 0; i < beans.size(); i++) {
        if (i % 50 == 0) {
            entityManager.flush();
            entityManager.clear();
        }
        entityManager.merge(beans.get(i));

        }
        commit();
    } catch (Exception e) {
        logger.error("Ocorreu um erro ao tentar salvar batch. MSG ORIGINAL: "
                + e.getMessage());
        rollback();
        throw new DAOException("Ocorreu um erro ao tentar salvar batch");
    }
    }

我的想法是,休眠的每50行將產生:

insert into tableA values (),(),()...

但是看着日志,我看到每個merge()命令的一個INSERT鏈接如下:

insert into tableA values ()
insert into tableA values ()
insert into tableA values ()
insert into tableA values ()

怎么了 ? 這是對的 ?

Hibernate默認情況下不啟用批處理。 您將需要考慮以下設置 (我認為至少需要batch_size才能使任何批處理插入/更新工作):

hibernate.jdbc.batch_size

非零值允許Hibernate使用JDBC2批處理更新。 例如建議值介於5到30之間

hibernate.jdbc.batch_versioned_data

如果您的JDBC驅動程序從executeBatch()返回正確的行數,則將此屬性設置為true。 通常可以安全地打開此選項。 然后,Hibernate將使用批處理的DML來自動版本化數據。 默認為false。 例如,真|

hibernate.order_updates (similarly, hibernate.order_inserts)

強制Hibernate通過要更新的項目的主鍵值對SQL更新進行排序。 這將導致高度並發的系統中更少的事務死鎖。 例如,真|

暫無
暫無

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

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