SQL接続を何度も開いたり閉じたりするのはどれほど悪いですか?正確な効果は何ですか?

StackOverflow https://stackoverflow.com/questions/1404261

質問

たとえば、SQLDataAdapterのFill()メソッドで多数のDataTablesを埋める必要があります:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

すべてのdataadapterオブジェクトが同じSQLConnectionを使用している場合でも、メソッド呼び出し前に接続状態が既に開いていない限り、各Fillメソッドは接続を開いたり閉じたりします。

知りたいのは、SQLConnectionsを不必要に開いたり閉じたりすると、アプリケーションのパフォーマンスにどのように影響するかです。この問題の悪影響(100,000人の同時ユーザー)を確認するために、どの程度拡張する必要がありますか?中規模のWebサイト(毎日50000ユーザー)では、すべてのFill()呼び出しをわざわざ検索して、それらをコード内にまとめて、Fill()呼び出しの前に接続を開き、その後閉じるのに価値がありますか?

役に立ちましたか?

解決

ADO.NETには接続プーリングがあります。接続を閉じると、実際には完全に閉じられるわけではなく、「リサイクル」されます。まったく同じ接続文字列で新しい接続を要求した場合。

それでも-これら5つのFillメソッドを1つずつ呼び出す必要があることを事前に知っている場合は、絶対にお勧めします

  • 接続を開く
  • データベースから5つのデータテーブルすべてを読み取る
  • すぐに接続を閉じる

この方法で行うことはベストプラクティスとして受け入れられていますが、害はありません。 :-)

マーク

PS:ADO.NETの接続プーリングは、もちろんオフにしない限り機能します! :-)デフォルトでオンになっています-明示的に無効にする必要があります。

他のヒント

キーポイント:

  • 接続を開いて維持し、再利用する理由

    パフォーマンス

接続を開いたり閉じたりしたい理由はたくさんあります。 あなたの使用のための最良のトレードオフがどこであるかを決定する必要があります。両方を行うことができます:一定期間または設定された数のトランザクションで開いている接続を使用し、それを閉じて新しい接続を開きます。

データベース内の他の単純なタスクと比較すると、

SQL接続のオープンとクローズは高価なです。しかし、実際のタスクがすでに 時間がかかっている場合は、余分なオーバーヘッドに気付かないことがあります(実際のタスクの待機期間を既に非表示にしている場合-ユーザーが物事をランダムにクリックし始めない-など)再試行)。

テストケース:

テストクエリの2つのバージョンを記述することで、あなたのの差を測定できます。単純なSQLタスクを選択します(各バージョンで同じにする必要があります)。

バージョン one では、ループの外部で1つの常時接続を開いて、単純なタスクをX回ループします。

で、ループの内部で接続の開閉を行います。

Xの回数を変更して、あなたの使用と期待に一致させます。これにより、あなたのシステムへの影響について本当に良い感じが得られるはずです。

基本を理解するのに役立つ希望...ジャック。

NECROの回答: 最善の方法は、「using」ステートメントに接続を配置して、必要な作業に範囲を限定することです。

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top