4

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

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() 呼び出しの前に接続を開き、後で閉じることに価値がありますか?

4

3 に答える 3

10

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

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

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

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

マルク

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

于 2009-09-10T10:08:02.023 に答える
1

キーポイント:

  • なぜ接続を開いて保持し、再利用するのですか?

    パフォーマンス

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

SQL接続の開閉は、データベース内の他の単純なタスクと比較するとコストがかかります。ただし、実際のタスクにすでに時間がかかる場合は、余分なオーバーヘッドに気付かない可能性があります(実際のタスクの待機期間をすでに非表示にしている場合、ユーザーがランダムにクリックし始めない場合(再試行など))。

テストケース:

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

バージョン1では、ループの外側にある単一の常時オープン接続を使用して、単純なタスクをX回ループします。

2番目では、ループの接続の開閉でそれを行います。

使用法と期待に一致するようにX回を変更します。これにより、システムへの影響を実感できます

それがあなたが基本を理解するのを助けることを願っています...ジャック。

于 2010-06-02T23:35:45.517 に答える