2011-08-03 26 views
2

私はこの巨大なシステムを昨日起動しました。同時接続数千人..私はSQL Server 2008と.NET 3.5(C#)を使用しています。データベースサーバーがビジー状態です。 DataContextを開く際に必要なアドバイス

今日私は、dbサーバが本当に遅くなっていることに気付きました(サーバマシンは本当に、このアプリケーションを簡単に10xのように扱うことができるので、私は自分の接続などを混乱させる必要があります)。

まず、私のビジネスクラスはそれぞれ1つの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); 
     } 

    } 

} 

あなたはこのことについてどう思いますか(クラスごとに1つのDataContext)?何をお勧めしますか?巨大なクラスにはいいですか?それはいいですか?

私はこのように、主に返品のためにIQueryable<Type>のようにしたいと思います。 (リターンのこの種にアクセスしようとしたとき、私はメソッドごとに1 DataContextを使用している場合、それはすでに破棄されます)

+0

データベースを同時に使用している何千人ものユーザーがいる大規模なシステムを計画していたのですが、なぜデータベースのセパシストを雇ってデータベースとクエリを設計していませんでしたか?大規模な高性能データベース分野では長年の経験が必要なため、アプリケーションプログラマは、パフォーマンスの良いデータベースを作成する可能性はほとんどありません。 – HLGEM

答えて

5

君たちは、この(クラスごとに1つのDataContext)についてどう思いますか?

これは面白いことではありません。例えば、トランザクション内の複数のクラスの更新をどのように同期させるのですか?あなたが適切な接続処理を気にしないので、200回の更新のための分散トランザクションはちょうどありますか?これは非常に高価です。あなたは、複数のクラス間の結合やプロジェクトにどのように対処していますか?技術的に不可能ではないということではなく、基礎となるプロバイダが最適化することができないという結果になる異なるデータコンテキスト(クラスごとに1つ)を強制しますが、開発者は、それを世話しません。

これは、ページの開始時に接続を開き、ページが終了したときに接続を閉じるなど、賢明なアプローチになるためには全面的に書き直す必要があります。まあ、別々のデータベーストランザクションが必要な場合は複数あることもありますが、一般的にはそうではありません。

さらに、リポジトリパターンについての初心者の本を入手してください。私たちはすべてのdbアクセスをDataManagerで実行します。

DataManagerには、IQueryableであるEntityのようなstufflが実装されています。最初は開き、必要に応じて使用して終了します。

+2

+1スポットがオンです。これがWebアプリケーションの場合は、リクエストごとに1つの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

関連する問題