4

先週、本番環境で発生した問題を診断しようとしています。簡単に言うと、データベース接続プールは ASP.NET 3.5 アプリからのアクティブな接続でいっぱいのようで、アプリケーション プールと IIS を再起動してもクリアされませんでした。

上級 DBA によると、ネットワーク接続はオペレーティング システム レベルで発生するため、アプリと IIS をリサイクルしても実際のネットワーク接続は切断されず、SQL Server はデータベース接続を切断して実行を継続し、アプリはまだデータベースに到達できませんでした。 .

データベース接続プールを強制的にリセットする方法を調べたところ、 static メソッド が見つかりました。SqlConnection.ClearAllPools()ドキュメントには、それが何を行うのかが説明されていますが、いつ呼び出すかについてはほとんど説明されていません。私のglobal.asax.csの最初Application_Startと最後でそれを呼び出すことは、アプリを汚染された接続プールから保護するための優れた安全対策のようですが、もちろん起動/シャットダウン時にパフォーマンスが低下します.Application_End

私が説明したことは良い習慣ですか?より良いものはありますか?目標は、他の多くのアプリに影響を与える OS や SQL Server サービスを再起動することなく、簡単なアプリの再起動でアプリの破損した接続プールをリセットできるようにすることです。

どんなガイダンスも大歓迎です。

4

1 に答える 1

2

プロセスが終了すると、すべてのネットワーク接続は常に、常に、常にすぐに閉じられます。それはTCPレベルです。ADO.NET とは関係なく、すべてのアプリケーションに適用されます。ブラウザを終了すると、すべてのダウンロードが停止します。FTP クライアントを強制終了すると、すべての接続がすぐに閉じられます。

また、接続プールはプロセスごとです。プールが空であるため、アプリの起動時にそれをクリアしても意味がありません。すべての接続はいつでも (正常に) シャットダウンされるため、シャットダウン時にクリアする必要はありません。

おそらく、アプリがプールへの接続を返していません。いずれの場合も、使用後はすべての接続を廃棄する必要があります。そうしないと、ダングリング接続が無期限に蓄積されます。

プールをクリアしても、使用中のように見えるため、ダングリング接続は解放されません。ADO.NET は、二度とそれらを使用しないとどのように判断できますか? できません。

sys.dm_exec_connectionsが接続を開いたままにしているかを確認します。応急処置として、ADO.NET プール サイズを増やすことができます。SQL Server は、インスタンスごとに 30,000 を超える接続を取ることができます。通常、それを飽和させることはありません。

于 2013-09-25T23:05:36.693 に答える