2016-12-12 10 views
0

私はこの変更を複数回繰り返しています。共有オブジェクト間のデータベース接続

私は2つのクラスShop & Source
Shop(約1000製品)​​があり、
Sourceを持っているすべてのクラスが同じデータベース上のいくつかのアクションを実行する必要がIList<Item>(約200)、
を持っています。まず

、私はすべてのオブジェクトとのオープンDbConnectionを共有:
そして、私のWebServiceのを構築し、それは私が開いた静的DbConnectionをキャッシュされた(それが聞こえる悪いとして)とそれを使用し、
問題となりました。
しかし、接続が散発的に閉じられ、ExecuteReader()投げられた(MARSを使用していない)複数の要求をテストするときに問題が発生し始めました。

Thisと、接続プールに頼っている他の多くの情報源を読んだ後。
私はクエリの直前に接続を開いて終了したら処分するようにコードを置き換えました。
私はパフォーマンスの低下に気付きました。
私はプールが機能しているか確認することができます

質問(あるいは、それはないですか?):どのように私は私のSqlConnectionプールを監視することができますか?

質問:これらの多くのオブジェクト間でこの接続を共有する他のデザインはありますか?

ありがとうございます。

答えて

1

パフォーマンス低下は、データベース接続の管理方法とは関係ありません。一般的に、接続を再作成するのはコストのかかる操作ではなく、.NETによってプールされ管理されます。あなたはあなたが望むだけ多くの接続を作成することができます、あなたがそれらを適切に廃棄していることを確認してください。基礎となるクエリや、アプリケーションの他の領域に問題がある可能性があります。

SqlConnectionプールを監視するにはどうすればよいですか?

  • あなたが見ることができPerformance Countersがあります。
  • は、これらの多くの オブジェクト間のこの接続を共有する他のデザインがありますperfmon

を使用して見てみましょう。

どのように接続文字列を読んでいますか?それ自体は静的である可能性がありますが、私はまだあなたの研究から注目しているように、接続プーリングに依存しています。接続を適切に処理していますか?

例(静的な接続文字列):

public static readonly string ConnectionString connString = ConfigurationManager.ConnectionStrings["YOURCONNECTION"].ConnectionString.ToString(); 

    private void TestMethod() 
    { 
     using (var dbConn = new SqlConnection(connString)) { 
      string query = "select ...."; 
      using (var dbCommand = new SqlCommand(query, dbConn)) { 
       ... 
      } 
     } 
    } 
+0

のConnectionStringは、同じ文字列が、各クラスのメンバーです。私はすべてのConnection、Command&Readerに 'using'ブロックを使用しています。 私は私の統計を見ていきます。私は何か他のものを滑っているかもしれないという結論を指しています。 –

+0

@TomerWこれを置くことができるユーティリティクラスを作成します。すべてのクラスでこれを複製する理由はありません。 –

+0

ありがとう、私は正確に私が何を変更したのかわからないが、コードをばかげた後、それは絶え間なく雷の速度を実行しています:) –

関連する問題