2012-10-12 49 views
3

我們在WCF服務(我們的業務\應用層)中使用EF4.3.1。我們將EF Code First與現有數據庫和Fluent Mapping(EntityTypeConfiguraiton)結合使用。 爲每個請求創建一個DbContext實例,然後處理掉。實體框架消耗大量內存(可能的內存泄漏?)

我們有一個使用DbContext的通用存儲庫。

在測試服務器上運行時,我們發現業務層應用程序池在30分鐘內出現內存不足,並且有10個併發用戶。我們將IIS工作進程轉儲並發現EF耗費大量內存,EF創建的大型對象堆中有很多對象。我們可以在堆上看到從數據庫檢索到的數據的對象。不確定DbContext配置是否正在處理此問題。 GC中的%時間非常高(> 16%)。 我們在轉儲文件中注意到的一件奇怪事情是,存在一個巨大的字符串對象(大約87MB),存儲了我所有映射文件的字符串表示形式。我發現這很奇怪,

有沒有人遇到任何這樣的內存泄漏EF問題?另外請讓我們知道,如果我們使用EF有什麼問題。請讓我知道是否需要更多細節。

感謝 普拉薩德

編輯 我們使用注射DI AutiFac(WCF集成)的的DbContext的實例。 Dbcontext的生存時間是InstancePerLifeTime(每個http請求一個請求)。我們已經實現了這種方式來在一個HTTPrequest中的所有存儲庫實例中共享DbContext的實例。

我們訪問數據庫的方式是 //聲明 IGenericRepository UserRepository {獲取;集;}使用AutoFac

//地產注入

//使用 VAR用戶= UserRepository.FindBy(U => u.userid ==「[email protected]」);

我們沒有在存儲庫中使用顯式事務。

+1

您能向我們展示一下您如何使用EF進行一些事務的例子嗎? – Jorge

+0

@Jorge,請找到編輯原來的問題。 – Prasad

+0

我們對此做了一些分析,看來像Sum \ Average這樣的操作通過一對多關係導致緩慢。我們將這些操作中的一部分移至了存儲的特效庫,並提高了性能。這也減少了內存壓力,我們仍然很好的調整將基於我們的研究結果添加評論 – Prasad

回答

2

我們在遞歸查詢大量記錄(百萬)時沒有處理DbContext也有類似的問題。由於WCF服務的狀態較少,並且由於您正在處理'DbContext',所以這可能不是您的問題(除非每個用戶在一次方法調用中同時將大量數據拉入上下文中)。

確保將每個數據庫邏輯塊封裝在using語句中。這應該允許垃圾收集器從內存中刪除上下文中的所有內容。

例如:

public void MyWcfMethod() 
{ 
    using(MyDbContext db = new MyDbContext()) 
    { 
     // All calls to database go here. 
    } 
} 

我唯一想到其他將是在您的服務(automapper等),其他一些圖書館仍與DbContext參考,從而從走出去的範圍預防。

+0

感謝史蒂夫您的回覆,但有一個問題,我們使用存儲庫,因此需要共享HTTP請求的DbContext,不知道如何使用此。我們已經使用Autofac DI實施了工作單元。 Autofac注入DbContext,我可以在會話結束之前驗證DbContext上的Dispose被調用。不知道爲什麼EF仍然消耗這麼多的內存 - Prasad – Prasad

+1

DbContext是我不注入Autofac只是爲了避免這個問題的唯一依賴項:) – Jordi

+0

你可以提供更多關於automapper的細節可能仍然有一個參考?這是一個已知的問題和解決方案嗎? – endyourif