2011-07-11 103 views
3

我遇到性能問題,其中一個聚合包擁有大量實體(1000+)。通常它最多隻包含50個實體,但有時還會包含更多。閱讀大包時NHibernate速度慢

使用NHibernate profiler我發現從數據庫中獲取這個包的1123條記錄的持續時間是18ms,但是它需要NHibernate 1079ms來處理它。這裏的問題是所有這些1123條記錄都有一兩條附加記錄。我使用fetch =「subselect」來獲取這些數據,並且獲取這些額外的記錄需要16ms從數據庫中獲取,並且通過NHibernate處理2527ms。所以這一行動需要3,5秒,這太昂貴了。

我讀到,這是因爲更新第一級緩存是這裏的問題,因爲它在加載大量實體​​時性能變慢。但什麼是很多? NHibernate Profiler說我有3145個實體加載了31個查詢(這在我的情況下是絕對最小值)。這個加載的實體數量對我來說似乎不是很多。

在我們使用NHibernate v3.1.0.4000

+0

試試看這裏:http://knol.google.com/k/nhibernate-chapter-16-improving-performance# – danyolgiax

回答

2

我同意,1000實體當前項目並不太多。你確定這個時間沒有被用在其中一個構造函數或屬性設置器中嗎?您可以在加載時間內停止調試器,隨時抽取一個隨機樣本。

此外請確保您使用反射優化器(我認爲它默認打開)。

我假設你測量查詢本身的時間。如果您衡量整個交易,那麼肯定會浪費時間來清理會話。通過將FlushMode設置爲Never(僅在會話中未存儲任何更改時)或使用StatelessSession來避免沖洗。

瘋狂猜測:刪除批處理大小設置甚至可能使其更快,因爲它不需要將實體分配給相應的集合。