2011-09-13 42 views
2

我有一個winforms系統C#.Net 2.0與ActiveRecord + NHibernate與PostgreSQL 9數據庫進行通信。 當用戶打開系統時,通過新的SessionScope()啓動與數據庫的通信。對於某些用戶來說,它的工作原理是完美的...但對於其他用戶而言,系統會產生內存泄漏,與msdn論壇中的Marcio問題相同:link。 我該如何解決這個問題?問題是在NHibernate!當我嘗試關閉ISession對象或嘗試提交事務時發生此錯誤。NHibernate + ActiveRecord + PostgreSQL = memoryexception

回答

1

OutOfMemoryException的根本原因可能在您發佈的代碼之外。你只是有內存泄漏,它可以在你的應用程序的任何地方。試圖分配更多內存的代碼會引發異常,而這些代碼不一定會導致內存泄漏。使用內存profiler來找出導致內存泄漏的原因。

但很可能這個問題是由於NHibernate中第一級緩存臃腫所致。從SessionScope文件:

與此同時,NHibernate的是保持變更範圍內的對象 的軌道。如果有太多的對象和太多的變化 要跟蹤,那麼性能會慢慢降級。所以現在需要衝洗 。

  • 擺脫GC呼叫,你不需要它們。
  • 限制會話的範圍
  • 沖洗/清除會議定期
  • 確保您使用lazy loading適當(不要裝入你不從數據庫所需的信息)
+0

哦...感謝您的回答。但是...我有一個登錄方法,總是適用於某些用戶,並且總是對其他用戶無效。錯誤不是隨機的!當NHibernate嘗試提交事務時總會發生這種情況! 我已經在我的代碼中加入了GC調用來嘗試解決問題,它們不是我的源代碼的標準。 在NHibernate的範圍內沒有太多的對象,因爲應用程序剛剛開始。錯誤是在函數login()中! – KaH600

+0

和: 是的!我正在定期清理會議!我有一個保護函數CloseSession()這樣做! 是的!我正確使用「懶惰」!沒有負載信息我不需要!我的代碼中有很多「Lazy = true」! 我認爲這是NHibernate的內部錯誤... Marcio(msdn,鏈接頂部)有同樣的問題!你對此有何看法? 我是巴西人......對不起,我的英語不好! ;) – KaH600

+0

NHibernate中的錯誤是可能的,但不太可能。您的應用程序中可能存在內存泄漏。也許你對物體的保留時間超過需要,GC無法清除它們。使用我在答案中提到的內存分析器,他們有免費試用版。 – Dmitry

相關問題