2011-04-02 57 views
2

我創建了一個hibernate組件來與大量傳入數據進行交互以保存數據,並以百萬行保存(創建)和更新數據。Hibernate性能刷新v提交

我知道關於flush v commit的主要區別,例如將「髒」數據同步到可持久的底層數據中,並且該flush允許您在不實際提交的情況下與底層持久數據同步,如果需要可以回滾。提交實質上是將所有持久數據提交給數據庫。

我創建了一個hibernate組件來與大量的傳入數據進行交互以保存數據,並保存(創建)和更新數據以百萬行爲單位的卷。

我知道關於flush v commit的主要區別,例如將「髒」數據同步到可持久的底層數據中,並且該flush允許您在不實際提交的情況下與底層持久數據同步,如果需要可以回滾。提交實質上是將所有持久數據提交給數據庫。

什麼是一個合理的大小做批量插入? IS 50合理的性能最高量,是這樣的:

for (i < 1000000) 
    if(i % 50) { 
     session.flush() 
    } 

我收集50應在hibernate.jdbc.batch_size 50

回答

1

匹配值這取決於你的數據。批處理大小是休眠將在其會話會話上保留的項目數量與爲了刷新而往返數據庫的往返行程中涉及的延遲之間的平衡。如果你的批量太小,你最終會往db裏做很多往返。如果你的批量太大,你最終會在hibernate的會話中持有很多對象 - 如果你的對象很胖,這可能會成爲問題。

我會說50是一個低數字:1M/50 = 20000往返。我想說,你從一個更大的數字開始,衡量表現。順便說一下,這僅適用於批量操作:hibernate.jdbc.batch_size是50用於常規應用程序事務。

PS不要忘記在刷新後清除休眠會話,否則即使在刷新後,hibernate也會在內存中保存持久化對象。