我們的應用最初是使用NHibernate構建的,其批處理的侷限性也在考慮之中。然而,隨着時間的推移,它已經轉變爲一個數據整理器,我們正在觀察到一個重要的性能衰退。在會話中使用過多對象來提高NHibernate性能
會話最終不得不維護大約1000個或更多的對象,我們的分析表明,自動沖洗和髒檢查是這裏最大的違規者。我們嘗試關閉自動刷新並在保存/更新操作中自行管理它,但這導致批處理保存/更新的災難性性能。 我們正在尋找從會話中驅逐不需要的對象的選項。
- 我遇到了二級緩存驅逐方法(
sessionFactory.Evict(typeof(Cat));
),它讓我們按類型驅逐,但我們不使用二級緩存。我仍然可以使用這種方法驅逐一級緩存中的對象嗎? - 我還閱讀了一個抓取對象的模式,將它們從會話中逐出,如果需要,通過調用Update()對它們重新進行重新關聯。這是一個推薦和接受的模式,因爲我也讀過NH3已經爲此提出了一堵牆? (我們仍然可以使用它,因爲我們還沒有升級到NH3)
雖然我們意識到我們並沒有以最好的方式使用NHibernate,但我們只是希望以某種方式改善當前的情況。非常感謝上述問題和任何其他建議/建議的答案。謝謝。
更新
看過NH文檔和代碼後,我意識到1可能是不可能的。我仍然在看使用Evict()的一些指針或提示。我能夠大幅減少會話中的對象數量。但仍然不知道在更新或刪除被驅逐物體時是否付出代價。感謝您的幫助提前。
我們已經看過了使用無狀態會話,但它不是一個可能的解決方案,因爲它會需要一些架構的返工。感謝您的提示傑森。 我仍然在看''Session.Evict()'作爲一個可能的生命保護程序,並想知道你是否有任何使用它的輸入,如第二點所述。 – 2011-03-03 23:01:31
我使用Session.Evict的唯一時間是當我知道我不需要對實體做任何事情並想釋放一些內存(這對於批量操作很有用)。也許你可以使用ISession.GetSession創建一個子會話。它共享相同的連接,但保留自己的實體列表以進行刷新 – 2011-03-04 00:53:47