2011-03-03 40 views
2

我們的應用最初是使用NHibernate構建的,其批處理的侷限性也在考慮之中。然而,隨着時間的推移,它已經轉變爲一個數據整理器,我們正在觀察到一個重要的性能衰退。在會話中使用過多對象來提高NHibernate性能

會話最終不得不維護大約1000個或更多的對象,我們的分析表明,自動沖洗和髒檢查是這裏最大的違規者。我們嘗試關閉自動刷新並在保存/更新操作中自行管理它,但這導致批處理保存/更新的災難性性能。 我們正在尋找從會話中驅逐不需要的對象的選項。

  1. 我遇到了二級緩存驅逐方法(sessionFactory.Evict(typeof(Cat));),它讓我們按類型驅逐,但我們不使用二級緩存。我仍然可以使用這種方法驅逐一級緩存中的對象嗎?
  2. 我還閱讀了一個抓取對象的模式,將它們從會話中逐出,如果需要,通過調用Update()對它們重新進行重新關聯。這是一個推薦和接受的模式,因爲我也讀過NH3已經爲此提出了一堵牆? (我們仍然可以使用它,因爲我們還沒有升級到NH3)

雖然我們意識到我們並沒有以最好的方式使用NHibernate,但我們只是希望以某種方式改善當前的情況。非常感謝上述問題和任何其他建議/建議的答案。謝謝。

更新
看過NH文檔和代碼後,我意識到1可能是不可能的。我仍然在看使用Evict()的一些指針或提示。我能夠大幅減少會話中的對象數量。但仍然不知道在更新或刪除被驅逐物體時是否付出代價。感謝您的幫助提前。

回答

3

如果不知道更多關於您的需求,很難說,但也許您可以使用IStatelessSession。它沒有第一級緩存擔心。

Ayende對使用它的批量操作 here

+0

我們已經看過了使用無狀態會話,但它不是一個可能的解決方案,因爲它會需要一些架構的返工。感謝您的提示傑森。 我仍然在看''Session.Evict()'作爲一個可能的生命保護程序,並想知道你是否有任何使用它的輸入,如第二點所述。 – 2011-03-03 23:01:31

+1

我使用Session.Evict的唯一時間是當我知道我不需要對實體做任何事情並想釋放一些內存(這對於批量操作很有用)。也許你可以使用ISession.GetSession創建一個子會話。它共享相同的連接,但保留自己的實體列表以進行刷新 – 2011-03-04 00:53:47

0

爲什麼不使用多個會話好的帖子,而不是一個大一個呢?這與關閉autoflush一起幫助我過去。另外,如果可能的話,您應該真的考慮使用HQL進行批量更新。

0

我知道這是舊的,但我只是在尋找其他東西時遇到了這個問題 - 剛剛解決了這個問題。我通過使用多個會話來解決Trent提到的問題。我會創建一個會話來獲取所需的所有對象,然後關閉該會話。我遇到過的情況是遍歷列表並對每個對象進行操作,並嘗試在每次迭代時進行提交。然後,我會在列表中創建foreach,在循環內部創建並處理一個新會話,將列表中的對象從列表重新連接到新會話。這需要花費大約2.5小時到2分40秒的過程!

請參閱本文的靈感,我如何解決它 - 雖然不完全是因爲我有工作包裝紙單位周圍的NHibernate:

http://weblogs.asp.net/ricardoperes/archive/2013/03/21/attaching-disconnected-entities-in-nhibernate-without-going-to-the-database.aspx