1

SQL Server 2008 を使用して Windows Server 2008 でサーバー アプリケーションを実行しています。

  1. カスタム接続プーリングを実装しました (なぜそれを行ったのかはまた別の長い話です)。したがって、リクエストごとに接続を開いたり閉じたりすることはありません。

  2. サーバー アプリケーションは、プールで利用可能な 10 の接続を使用して、1 分間に数千を超える DBCommand を実行します。

  3. コマンドの実行後、接続をクリーニングしていません(何をクリーニングし、閉じて再度開かずにクリーニングする方法がわからないため)、コマンドオブジェクト自体を破棄していません。

  4. サーバー アプリケーションがダウンすると、close メソッドを呼び出してすべての接続を解放します。

ここで、sqlserver の 1 時間または 2 プロセスのテストの後、3Gig のメモリが使用されることを確認しました。その後、サーバー アプリケーションをシャットダウンしても、占有されていたメモリが解放または削減されませんでした (タスク マネージャーとリソース モニターによると)。 sqlserver を使用してメモリを解放します。

以下は私の質問です。

  1. 毎回 DBCommand オブジェクトの Dispose を呼び出す必要がありますか? はいの場合、接続オブジェクトに影響が残りますか?

  2. 上記の問題は、私が観察したことを引き起こしているか、他の理由もあります。

  3. 接続を閉じずにクリーンアップする方法と、DbCommand の実行ごとにクリーンアップする必要があるゴミの種類はありますか。

ありがとうムバシャール

4

4 に答える 4

2

次に、占有されているメモリが解放または削減されていないにもかかわらず、サーバーアプリケーションをシャットダウンしました(タスクマネージャーとリソースモニターによると)[...]

アプリケーションを閉じるとすべてのオブジェクトが破棄されるため、この観察結果から、オブジェクトが破棄されていないことがメモリ損失の問題の原因ではないことが明らかになります。(それでも、David が正しく指摘したように、常に IDisposables を破棄することをお勧めします。)

したがって、SQL Server のメモリ構成を確認する必要があります。メモリが利用可能な場合、そのメモリを使用する SQL Server は良いことであることに注意してください。未使用のメモリはお金の無駄です。通常、SQL Server は、他のプロセスでメモリが必要になるとメモリを解放します。

SQL Server がメモリを動的に使用している場合、定期的にシステムにクエリを実行して、利用可能な空き物理メモリの量を判断します。SQL Server は、サーバーのアクティビティに応じて、バッファー キャッシュを拡大または縮小して、空き物理メモリを 4 MB から 10 MB の範囲に保ちます。これにより、Microsoft Windows NT® 4.0 または Windows® 2000 のページングが防止されます。空きメモリが少ない場合、SQL Server は通常空きリストにある Windows NT 4.0 または Windows 2000 にメモリを解放します。空きメモリがさらにある場合、SQL Server はメモリをバッファ キャッシュに再コミットします。SQL Server は、ワークロードがより多くのメモリを必要とする場合にのみ、バッファ キャッシュにメモリを追加します。休止中のサーバーはバッファ キャッシュを拡張しません。

したがって、サーバーが過剰にスワップし始めない限り、SQL Server のメモリ消費についてあまり心配する必要はありません。

于 2010-01-21T09:14:19.930 に答える
1

SQL Serverは大量のメモリを使用し、必要になるまでそれを返さないため、常に専用のマシンでSQLを実行する必要があります。共有環境で使用する必要がある場合は、最大メモリ制限を構成できますが、アプリケーションがSQLにメモリを解放させる方法はありません。

于 2010-01-21T08:51:01.470 に答える
1
  1. 常にDispose() IDispose-ables。

  2. わからない。

  3. プールに戻す前に、sp_reset_connectionを使用して接続をリセットします。

于 2010-01-21T08:56:05.940 に答える
0

接続プールが制御され、基本的に次のもので構成される接続文字列にパラメータが渡されます。

・接続タイムアウト

· 最小プール サイズ

· 最大プール サイズ

・プーリング

アプリケーションが非常に短いスパンで膨大な数の接続を生成することがわかった場合は、まずアプリケーションで開いている接続を確認し、作業が終了したらすぐにそれらを閉じるようにしてください。閉じられた接続は実際には閉じられず、サーバーへの別の要求で使用できるようになります。特に DataReader オブジェクトを確認し、コンテキストから外れたらすぐに閉じてください。開発者は、ネストされたループで複数の DataReader を使用し、finally 句ですべての DataReader を閉じることがあります。これを行わず、ループから抜けたらすぐに DataReader を停止してください。はい、いつでも finally 句で DataReader オブジェクトのステータスを確認できます。閉じられていない場合は、閉じることができます。

ここで、ConnectTimeout を最小値 (たとえば 1 秒) に調整して確認します。これにより、アプリケーションによって閉じられたプール内の接続の寿命が設定され、MaxPoolSize がサーバーの最大制限に設定されます。他のアプリケーションが同じサーバー データベースに接続されていなければ、100 になると思います。ConnectTimeOut を最小に設定するため、MinPoolSize の値を 5 に設定します。この場合、接続プールを効率的に機能させるには、いくつかの接続を常に利用できるようにする必要があります。

これらの設定と変更を試してください。これがあなたの満足に働くことを願っています。

ありがとう、

ラジーヴ・ランジャン・ラル

于 2010-01-21T09:14:11.793 に答える