2011-08-03 42 views
2

我有這個巨大的系統開始運行昨天。成千上萬的人同時連接..我使用SQL Server 2008和.NET 3.5(C#);數據庫服務器太忙。建議需要打開DataContexts

今天我發現我的數據庫服務器變得非常慢(順便說一句,服務器機器真的,真的能夠輕鬆處理10x這個應用程序,所以我必須搞砸我的連接或什麼)。

首先:My Business類每個都創建一個唯一的DataContext。在課堂上,像這樣:

public class BusProduct : IDisposable 
{ 
    //DataContext 
    DBDataContext db = new DBDataContext(); 


    //Variable of type DAL.Products (that will be set on application level) 
    public Products _attributes { get; set; } 

    //Dispose 
    public void Dispose() 
    { 
     Dispose(true); 

     GC.SuppressFinalize(this); 
    } 

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

    /// Constructor 
    public BusProduct() 
    { 
     try 
     { 
      //New object 
      _attributes = new Product(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message,ex); 
     } 
    } 

    public void Insert() 
    { 
     try 
     { 
      //Insert data set on _attributes 
      db.Products.InsertOnSubmit(_attributes); 
      db.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message,ex); 
     } 

    } 

} 

你們怎麼看待這個(每個類一個DataContext)?你會建議什麼?對於巨大的課程好嗎?它甚至好嗎?

我喜歡使它像這樣,主要是因爲返回像IQueryable<Type>。 (當試圖訪問這種回報的,如果我用一個DataContext每種方法,將已被佈置)

+0

如果您計劃一個大型系統,同時有數千名用戶同時訪問數據庫,您爲什麼不聘請數據庫專家來設計您的數據庫和查詢?大型高性能數據庫領域是需要多年經驗的專業,應用程序員的創建數據庫性能接近零百分比。 – HLGEM

回答

5

你們覺得這個怎麼樣(每級一個DataContext的)?

你所做的在很多層面上都是錯誤的,例如,如何在事務中的多個類上同步更新?只是因爲你不關心正確的連接處理,所以需要200次更新的分佈式事務?這非常昂貴。你如何處理多個類之間的聯接和項目?您強制使用不同的數據上下文(每個類一個),這將導致底層提供者完全無法優化 - 而不是技術上不可行,但我相信開發人員會告訴您在被問及爲什麼時適當地起訴這些內容沒有照顧它。

這將需要一個完全重寫來進入一個明智的方法 - 在頁面開始時打開連接,在頁面結束時關閉它。那麼,如果你需要單獨的數據庫事務,有時候不止一個,但通常 - 不。

另外得到一本初學者書籍,告訴你關於存儲庫模式。我們通過DataManager運行所有數據庫訪問。

DataManager包含連接,實現類似Entity的stuffl,它是IQueryable。在開始時打開一個,根據需要使用它,完成。

+2

+1點。如果這是一個Web應用程序,請爲每個請求打開一個DataContext。 –

+0

這可能會幫助您開始創建通用存儲庫。 http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application# – Asdfg

+0

別忘了像這樣的系統需要實際知道如何設計數據庫以實現性能和調整查詢的人員。我想說的是,連接問題的可能性比錯誤要多得多。也許它應該在上線之前進行負載測試? – HLGEM