簡體   English   中英

如何提高 spring mvc 中批量事務的性能

[英]how to improve the performance of bulk transaction in spring mvc

我正在使用 java spring mvc 與 JPA 和 ZCB1F008EEFE65012C4EFZA2C3。 如果我想處理 2000 個事務,我可以使用線程分批處理 500 個事務,考慮到單個事務應該由同一個線程處理嗎?還有其他方法嗎?

Hibernate 默認不啟用批處理。 這意味着它將為每個插入發送單獨的 SQL 語句。

要一次性插入如此龐大的數據集,您應該使用批量插入。 這里的 hibernate 屬性: hibernate.jdbc.batch_size = 50hibernate.order_inserts = true

第一個屬性告訴 Hibernate 以 50 個為一組收集插入(此處僅使用 50 個作為示例......)。 order_inserts 屬性告訴 Hibernate 花時間按實體對插入進行分組,從而創建更大的批次。

然后您應該在顯式或隱式刷新之間進行選擇。

  1. 隱式:只需設置批量大小屬性,hibernate 將執行 rest。
  2. 顯式flushclear
for (int i = 0; i < 10; i++) {
        if (i > 0 && i % BATCH_SIZE == 0) {
            entityManager.flush();
            entityManager.clear();
        }
        A a = new A();
        entityManager.persist(a);   
}

那么為什么要使用第二個選項呢?

當我們持久化一個實體時,Hibernate 將它存儲在持久化上下文中。 例如,如果我們在一個事務中持久化 2,000 個實體,我們最終將在 memory 中擁有 2,000 個實體實例,這可能會導致 OutOfMemory...

其他問題......正如你所說,你正在使用 MySQL。 hibernate 批處理選項不適用於 IdGenerator IDENTITY ,因此您不能將批處理插入與 mysql 的AUTO-INCREMENT功能一起使用。 由於 MySQL 中不存在序列生成,因此您被TABLE生成器困住了。 但是表生成器的性能不如標識一。 提到 Vlad mihalcea(引自他的名著《 High Performance Java Persistence 》)

當使用 MySQL 並且需要大量插入時,使用 JOOQ 框架是一個好主意。

暫無
暫無

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

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