2011-03-14 8 views
8

私は古い学校のADO.netをC#で使っていますので、この種のコードがたくさんあります。クエリごとに1つの関数を作成し、毎回dbを開いたり閉じたりするのがよいでしょうか、同じ接続で複数のクエリを実行するのが良いでしょうか?下の例は、単なる例です。クエリごとにdbを開いて閉じるべきですか?

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnectMain"].ConnectionString)) 
    { 
     // Add user to database, so they can't vote multiple times 
     string sql = " insert into PollRespondents (PollId, MemberId) values (@PollId, @MemberId)"; 

     SqlCommand sqlCmd = new SqlCommand(sql, connection); 

     sqlCmd.Parameters.Add("@PollId", SqlDbType.Int); 
     sqlCmd.Parameters["@PollId"].Value = PollId; 

     sqlCmd.Parameters.Add("@MemberId", SqlDbType.Int); 
     sqlCmd.Parameters["@MemberId"].Value = Session["MemberId"]; 

     try 
     { 
      connection.Open(); 
      Int32 rowsAffected = (int)sqlCmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      //Console.WriteLine(ex.Message); 
     } 
    } 
+0

これは複数の連続したクエリ(500個の挿入など)ですか?または定期的なクエリですか? –

答えて

7

ほとんどの場合、クエリごとに接続を開いたり閉じたりする方法があります(Chris Livelyが指摘したように)。しかし、このソリューションではパフォーマンスのボトルネックに遭遇するケースもあります。

たとえば、以前の結果に依存する比較的高速の実行クエリを処理する場合、単一の接続で複数のクエリを実行することをお勧めします。データのバッチ処理やレポート作成のためのデータマッサージを行う際にこの問題が発生する可能性があります。

あなたがフォローしているパターンに関係なく、常にmem leakを避けるために、必ず '使用'ラッパーを使用してください。

+0

「 ''ラッパーを使用する」とはどういう意味ですか? –

+0

@ TrackABill.com using(SqlConnection connection = new SqlConnection(connectionString)) {//何か} – MusicAndCode

11

あなたが例外を受けても処理されるように、接続はusingであり、プーリングを有効にしている限り(SQLサーバーの場合はデフォルトで有効になっています)、大したことではありません。クローズ(または廃棄)すると、の基底プールにはの接続が返されます。どちらのアプローチも有効です。申し訳ありませんが、多くの助けになりません; p

他の長いdb以外の作業をしている間は、オープン接続を維持しないでください。それを閉じて、再度開きます。あなたは実際に同じ基本的な接続を元の状態に戻すかもしれませんが、他の人(別のスレッド)があなたがいない間にそれを利用しているかもしれません。

+1

+1はプーリングに言及していますが、それはかなり重要です。 –

3

単一のコマンドが単一のメソッド内で実行されるようにメソッドが構造化されている場合、Yes:各コマンドの接続をインスタンス化して破棄します。

同じコードブロックで複数のコマンドが実行されるようにメソッドが構造化されている場合、外部ブロックは接続のための使用節である必要があります。

ADOは接続プーリングについて非常に優れているため、コマンドオブジェクトのインスタンス化と破棄は非常に高速になり、実際にはパフォーマンスに影響しません。

例として、ページを構成するために50個のクエリを更新するいくつかのページがあります。実行するクエリを決定するための分岐コードがあるため、それぞれに独自のusing (connection...)句がラップされています。

私たちは一度それらを切り取り、1つの接続オブジェクトをつかみ、個々のメソッドに渡しました。これは正確にゼロのパフォーマンス向上をもたらしましたが、接続が確実に最後に配置されることを確実にするために、すべての例外句でコードが複雑になりました。テストが終わったら、コードを以前の状態に戻しました。何が起こっていたのか、いつ接続が使用されたのかを正確に知るためには、きれいになりました。

2

さて、いつものように、それは依存しています。同じメソッド呼び出しで5つのデータベース呼び出しを行う場合は、おそらく単一の接続を使用するべきです。

しかし、何も起こっていない状態で接続を保持することは、スケーラビリティの観点から通常は勧められません。

2

ADO.NETは現在古い学校ですか?うわー、あなたはちょうど私が年をとるようにしました。私にとっては、Windows 3.1上でBorland C++を使用するRogue Wave ODBCは古い学校です。

回答するには、一般に、データドライバの仕組みを理解する必要があります。接続プーリングのような概念を理解し、クエリの接続/切断と実行に関連するトランザクションコストをプロファイルする方法を学びます。それから知識を取り、それをあなたの状況に適用してください。

関連する問題