ASP.NET/ADO.NET:.NETオブジェクト内の多くのデータベース接続を処理しますか?
-
22-07-2019 - |
質問
データベースで多くの読み取り/書き込みを行う.NETオブジェクトがあります。このオブジェクト(またはそれを使用するASPページ)のライフサイクル全体を通して、1〜10回のクエリ/更新でデータベースにヒットする可能性があります。
オブジェクトがデータベースにアクセスする必要があるたびにデータベース接続を開いたり閉じたりする代わりに、インスタンス化中にデータベースへの接続を開き、オブジェクトの終了イベント中に接続を閉じます。それは悪い習慣ですか?
オブジェクトは、インスタンス化されるたびに(そして通常は複数回)データベースにヒットするため、オブジェクトの存続期間の最初に接続を開き、最後に閉じることをお勧めします。
他の方法は、各クエリ/操作の前後にデータベース接続を開いたり閉じたりすることです。
パフォーマンスを最大化するためのここでのベストプラクティスは何ですか?
****更新**** ヒントをありがとう。オブジェクトのインスタンス化/終了イベント内の接続を開く/閉じる方法とその影響について、誰でももっと話すことができますか?
解決
必要に応じて接続を開きます。 ADO.NETには、機能する接続プーリングが組み込まれています。何千ものオープン/クローズを伴うループでこれを行っていない限り、パフォーマンスの問題に気付くことはありません。
編集 データアクセスレイヤーでsqlconnectionを保持する必要がありますか? 接続の持続性の落とし穴に関する詳細情報。
他のヒント
毎回開く/閉じる...実際にデータベース操作を実行するコード行の直前に(できるだけ近く)開き、その後すぐに閉じます。この方法でこれを行うと、ADO.netは実際に接続を閉じず、ADO.net接続プールに解放します。ADO.net接続プールでは、同じ接続文字列を使用した接続の次の要求を待機します。毎回実際に接続を再作成するというovberheadは発生していません...
唯一の問題は、プール内の接続の最大数を超えるほど多くの接続試行を非同期で実行している場合です。System.Threading.ThreadPoolクラスを使用して、この問題に対する解決策もあります。 ..
接続プールの引数に信頼を追加するには-接続プールがDBを必要とする他のコンポーネントとその接続を共有できないため、必要以上に接続を開いたままにすると、全体的なパフォーマンスが実際に低下します接続。
したがって、はい、必要に応じて接続を開いたり閉じたりします。ただし、クエリを1つのexec呼び出しにバッチ処理できると、さらに高速になります。
ado.netが実際に接続を閉じない場合でも、閉じた場合:Conn.Close()は" sp_reset_connection"を実行します。サーバーでは、sp_reset_connectionが軽量のストアプロシージャであっても、ネットワークトラフィックを生成します。 たとえば、ループ内で接続を閉じたり開いたりすることはお勧めしません。