2011-02-19 48 views
3

我有一個ASP.NET MVC 3應用程序,它有一個MS SQL Server 2008遠程數據庫,通過Fluent NHibernate連接。我有另一個應用程序正在向URL發出各種GET請求,這會觸發將新項目添加到數據庫中。每次添加項目時,本地Web服務器的內存都將增加大約100k。ASP.NET MVC 3 - WebDev服務器泄漏內存與流利的NHibernate?

public ActionResult AddItem(string text) 
    { 
     using (var DatabaseSession = new FluentDatabase().Session) 
      using (var tx = DatabaseSession.BeginTransaction()) 
      { 
       Item item = DatabaseSession 
          .QueryOver<Item>() 
          .Where(x => x.Text == text) 
          .SingleOrDefault(); 
       if (item == null) 
         item = new ... // initialize 

       item.Text = text; 

       DatabaseSession.SaveOrUpdate(item); 
       tx.Commit(); 
       DatabaseSession.Flush(); 
      } 

     return RedirectToAction("Index"); 
    } 

我知道這是不是將項目添加到數據庫的理想方式,但是這僅僅是一些其他的功能測試。經過約1000次調用此方法後,服務器佔用了1GB以上的數據!不久之後,我耗盡內存並崩潰。它沒有多大意義,因爲所有的項目都應該被垃圾收集。有什麼我在這裏失蹤?

+0

你不需要在事務中調用Flush,你只需要調用commit。 – Phill 2011-02-19 00:43:53

+0

我也這麼認爲,但是當我沒有調用flush時,它並沒有更新我的數據庫。 – 2011-02-19 00:45:08

回答

5

找到問題的最簡單方法是使用一些內存設置,他們會告訴你哪些對象是住在內存和誰在阻礙他們:

  1. MemProfiler,支付,http://memprofiler.com/

  2. CLR Profiler,免費,.Net 4的Microsoft CLR Profiler - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=be2d842b-fdce-4600-8d32-a3cf74fda5e1,.Net 2和3.5的CLR Profiler - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0。這裏是它的文檔 - http://msdn.microsoft.com/en-us/library/ff650691.aspx