[英]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
在不同的級別上運行。
您的循環在(您選擇的)實體上運行。 但是單個客戶可能需要多個插入內容(例如,當一個客戶具有多個地址時)。 使用循環方法,所有這些插入都將作為簡單的單個插入執行。 flush
和clear
只會阻止會話無限制地增長。
另一方面, hibernate.jdbc.batch_size
會將相同且僅在參數值上不同的語句捆綁(插入)到一個帶有參數集列表的語句中。 這樣的批處理語句的執行應該比等效的單個語句更有效地由數據庫處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.