0

設定:

C# で .NET WinForms アプリケーションを作成して、テクニカル サポート担当者が製品の SQL Server 2005 データベースに対して一般的なタスクを簡単に実行できるようにしています。アプリケーションは ADO.NET ( SqlConnection) を使用してデータベースに接続しています。このアプリケーションを開発する際の懸念の 1 つは、タスク (クエリ) が開始されるたびにデータベースに接続/再接続するオーバーヘッドを最小限に抑えることでした。私の理解では、このオーバーヘッドの主な理由は、データベースにAutoCloseがあるためです。プロパティを「True」に設定します。これを変更したいのですが、残念ながら私の管理下にはありません。また、データベース接続の作成には何らかのオーバーヘッドが伴うことも認識しています。私は、アプリケーションのライフサイクルを通じて単一の接続を維持するアプリケーションの実用的な実装を持っていました (以前に閉じられていない限り)。その後、ADO.NET での接続プールに関する MSDN の記事を偶然見つけました。

記事 (およびその他の質問/回答herehere、およびhere ) を読んだ後、アプリケーションがそのSqlConnectionオブジェクトを適切に破棄した場合でも、ADO.NET 接続プールはデータベースへの接続を維持するようです。接続はプールに保持され、一定期間アイドル状態になるか、切断されるまで再利用できます。SqlConnectionしたがって、アプリケーションで単一の接続を維持するという私の作業は不必要であり、必要になるたびに単純に を作成/破棄するよりも確実に危険に思えます。

質問:

  1. "AutoClose" が "true" に設定された SQL Server データベースで ADO.NET 接続プールを使用すると、どのような影響がありますか?

  2. 接続プーリングが舞台裏でどのように機能すると信じているかを説明すると、単純化しすぎている可能性があることは承知していますが、それはさておき、私の理解は正確ですか? そうでない場合、どこを修正する必要がありますか?

4

1 に答える 1

2

最初の質問ですが、データベースが自動クローズに設定されているのはなぜですか? 有効なシナリオには、マルチテナント ホスティングと Express インスタンスが含まれますが、データベースを自動クローズに設定しないでください。

接続プーリングは、SQL Serverインスタンスで開かれたセッションを維持します。セッションは現在のデータベースに参照を保持するため、自動閉鎖を防ぎます。シナリオに 1 つのアプリケーション データベースが含まれる場合、そのデータベースは自動クローズされるべきではありません (マルチテナント、数千のデータベース、シナリオではありません)。シナリオに数千のデータベースが含まれる場合、アプリケーションでそれらを開いたままにしないでください。また、すべてのデータベースを開いたままにすることもできません

あなたの場合の適切なアクションは、データベースを auto-close OFFに設定することだと思います。

于 2009-08-13T23:01:36.080 に答える