簡體   English   中英

通過顯式調用session.flush()設置Hibernate屬性hibernate.jdbc.batch_size

[英]Setting Hibernate property hibernate.jdbc.batch_size over explicitly calling session.flush()

瀏覽hibernate的批處理文檔https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html 我嘗試了一個在hibernate配置文件中設置批處理大小屬性( hibernate.jdbc.batch_size = 20 )的示例,然后進行刷新和清除,如下所示:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

現在的事情是,如果我將i的值設置為50,那么它將刷新記錄作為批處理50。因此,如果我可以在循環中控制批處理大小,為什么還要設置hibernate.jdbc.batch_size 20個物業。

有人可以解釋兩種方法之間的區別嗎,即通過顯式調用flush來設置屬性。

我的理解是,您的循環和hibernate.jdbc.batch_size在不同的級別上運行。

您的循環在(您選擇的)實體上運行。 但是單個客戶可能需要多個插入內容(例如,當一個客戶具有多個地址時)。 使用循環方法,所有這些插入都將作為簡單的單個插入執行。 flushclear只會阻止會話無限制地增長。

另一方面, hibernate.jdbc.batch_size會將相同且僅在參數值上不同的語句捆綁(插入)到一個帶有參數集列表的語句中。 這樣的批處理語句的執行應該比等效的單個語句更有效地由數據庫處理。

暫無
暫無

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

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