2012-08-24 69 views
3

對不起,如果有人已經回答了這個具體問題,但我還沒有找到我的問題的答案,所以在這裏。休眠Session.flush()效率問題

我正在研究一個應用程序(不能,因爲它是一個工作,所以我對此感到抱歉),它使用DAO,Hibernate和POJO以及所有這些東西來進行通信和寫入數據庫。這適用於應用程序,假設我在調用Session.flush()時沒有大量數據來檢查。話雖如此,有一個頁面,用戶可以添加任意數量的項目到一個產品,並且有一個特定的情況,其中有25個項目的內容。每個項目有大約8個字段,全部存儲在數據庫中。當我調用flush時,它會將所有內容保存到數據庫中,但需要FOREVER才能完成。三條線我打電話是:

merge(myObject); 
Session.flush(); 
Session.refresh(myObject); 

我已經嘗試了很多事情來解決這個問題,和一些不同的解決方案,以便回來,說:「不要用流感略有相似之處()」 ISN不同的組合因爲saveOrUpdate()和其他休眠會話似乎不起作用。我能想到的唯一解決方案是廢棄整個項目(我們得到的代碼是遺傳的,編寫得很少),或者告訴用戶社區吸收它。

這是我從Hibernate API的理解,如果你想寫數據到數據庫,它會對每個項目運行一次檢查,如果有差異,它會創建一個更新查詢隊列,然後運行查詢。看起來這些數據每次都在更新,因爲即使其他值不變,我數據庫中的「DATE_CREATED」列也是不同的。

我想知道的是,如果有另一種方法來阻止如此大量的數據提交或從「check」hibernate中排除特定列的方式,那麼我不必提交所有25個項目,如果我只改變了1?

在此先感謝。

邁克

+0

25並不是真的那麼多,除非物體是巨大的。無論如何,每個項目是在自己的會話中處理的,還是都在沖洗前被添加到會話中? – hvgotcodes

+0

好吧,原來它更像是60+對象哈哈。我不記得這麼多,但現在有多少。儘管每個項目都被添加到同一個會話中,但最後我會調用flush。我試着將POJO中的dateCreated字段設置爲updatable = false,作爲確保檢查不會發生在該字段上的問題,但這不起作用。有什麼想法? –

+0

你需要弄清楚什麼是花時間。是對象操作,數據庫插入,無論什麼...... – hvgotcodes

回答

1

我想知道是,如果有另一種方式來防止這種 大數據或排除來自特定列 的「檢查」休眠這樣做我不」的方式提交如果我只對1進行了更改,則必須提交全部25個項目 。

我會對應用程序進行配置文件,以確保對刷新的髒檢查實際上是問題。如果您發現確實如此,則可以使用evict來管理會話大小。

session.update(myObject); 
session.flush(); 
session.evict(myObject); 
2

那麼,你真的無法避免在休眠中的髒檢查,除非你使用StatelessSession。當然,你會因此喪失很多功能(延遲加載等),但這取決於你做出這個決定。

另一種選擇:我肯定會嘗試在您的實體中使用dynamic-update = true。像:

@Entity(dynamicUpdate = true) 
class MyClass 

使用它,Hibernate將只更新修改列。在小列表中,列數很少,但效率不高,但在您的情況下,它可以幫助使整個過程更快,因爲您無法避免使用常規Hibernate會話進行髒檢查。更新幾列而不是整個對象總是更好,對嗎? This post有關動態更新屬性的更多信息。

+0

這聽起來似乎至少可以修復性能問題。我也會研究StatelessSession,因爲我認爲懶加載是用戶不能沒有的東西。謝謝您的幫助。如果你想其他的東西,請發佈。 –

+0

是的。看一看。關於StatelessSession,我並不是說你必須在任何地方使用它。就在上面那種情況下,你需要使用批處理。 ;) –