2014-09-04 137 views
2

我們有一個使用(共享)SQL Server數據庫在ASP.NET 4.5上運行的站點。我們的ISP最近告訴我們,我們有太多的開放連接,它影響了服務器的整體穩定性。在高負載情況下,這個數量可以達到多達400多個打開的連接,大約200個併發用戶訪問該站點。實體框架打開連接

該網站主要由評論和博客文章等內容組成,我們已在整個網站實施緩存。我們專門使用Entity Framework來查詢數據庫。我們使用StructureMap將連接字符串注入到業務邏輯類中。

StructureMap初始化:

var ecsbuilder = new EntityConnectionStringBuilder(); 
ecsbuilder.Provider = "System.Data.SqlClient"; 
ecsbuilder.ProviderConnectionString = @"data source=***;initial catalog=***;persist security info=True;User ID=***;Password=***;multipleactiveresultsets=True;App=EntityFramework"; 
ecsbuilder.Metadata = @"res://*/Data.***.csdl|res://*/Data.***.ssdl|res://*/Data.***.msl"; 
string connectionString = ecsbuilder.ToString(); 
For<SiteModelContainer>().Use<SiteModelContainer>().Ctor<string>("connectionString").Is(connectionString); 
For<IGalleryService>().Use<GalleryService>(); 
...all the rest of our services 

然後在我們的服務(如GalleryService),我們有以下幾點:

private readonly SiteModelContainer _context; 

public GalleryService(SiteModelContainer context) 
{ 
    this._context = context; 
} 

在我們的服務方式,我們只是用_context查詢數據庫

我的問題是:

  1. 如果這是我們查詢數據庫的唯一方法,是否由於某種原因沒有關閉連接?
  2. 我可以使用哪些方法來確定連接的開放位置?

感謝

+0

這也發生在我身上,即使我用「使用」的聲明,但無法從那裏連接被泄露找到。 – Mairaj 2014-09-04 05:00:03

+0

連接池應該有所幫助。如果可能的話,也可能要考慮重新制定緩存計劃。如果正確完成,緩存應該能夠將大量的後端調用移除到數據庫。 – 2014-09-04 05:15:36

+0

@MairajAhmad我的印象是StructureMap自動處理上下文嗎? – Peuge 2014-09-04 06:15:45

回答

0
  1. 使用連接池的連接的字符串中。
  2. 使用塊使用上下文如下。

    //創建一個類和靜態函數來獲取上下文

    public class DaatabaseFramework 
    { 
        public static SiteModelContainer GetContext() 
        { 
         return new SiteModelContainer(); 
        } 
    } 
    

    //使用下面使用上下文

    using (var context=DaatabaseFramework.GetContext()) 
    { 
    
    } 
    
0

我看到類似的,當我嘗試從使用(...連接...){}塊傳遞IQueryable變量。

當我這樣做時,孤兒連接像我的網站一樣留在我的網站上。

嘗試找到這樣的代碼:

public IQueryable<YourClass> func(int param1) { 
    using(var context=DaatabaseFramework.GetContext()) { 
    return context.MyTable.Where(_=>_.Param1==Param1); 
    } 
}