2017-02-28 162 views
2

我試圖找出在我的平臺上使用WebAPI和實體框架執行操作的最佳方式。ASP.NET WebAPI 2 +實體框架連接緩存的最佳實踐

現在我正在每個請求創建一個新的連接:在每個控制器中都有一個對象爲每個方法實例化和處理。

public class SchedulerController : ApiController 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
      db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 

在我看來,爲每個請求創建連接是一個影響性能的完整開銷。我知道在Java上有一些工具(Nutcracker可能?)處理一種連接池以重用相同的連接,並通過這種方式提高性能。

在c#/ ASP.NET/Azure平臺中是否有類似的東西?

我真的很感謝在請求數量上的性能比較。

編輯:這主要是指DbContext自己做的緩存。

+2

創建新的DbContext不會打開任何數據庫連接 – ErikEJ

回答

5

我認爲你誤解了實體框架的工作原理。

EF在封面下使用ADO.NET,因此連接池實際上由提供者管理。您可以通過連接字符串更改池的行爲。我相信它默認重用連接。

EF還在內部使用了一些類似於工作單元的模式,因此它旨在封裝一組操作(因此在名稱中包含「上下文」一詞)。這就是爲什麼你有一個SaveChanges()方法將所有內容「提交」到數據庫。

因此,實際上建議您爲每個請求創建一個新實例,以保證「工作單元」的完整性,即使如此,仍應確保以變換方式保存更改到數據庫的事物的原子事務。

但是,您可以做什麼,只需在需要時創建實例,而不是讓控制器在每個請求上創建實例。再次,如果您使用Web API機會,您幾乎總是需要訪問數據...