SQL Server の未使用の SqlDependency オブジェクトをクリアしてメモリを解放する
SQL Server のメモリ管理は、期限切れの SqlDependency
オブジェクトの蓄積によって影響を受ける可能性があり、SQL Server プロセスによるメモリ消費量が増加します。 これは、特に SQL Server Express のパフォーマンスに重大な影響を及ぼし、メモリ枯渇やアプリケーションのクラッシュを引き起こす可能性があります。
問題への対処
核心的な問題は、Microsoft の SqlDependency
がどのように機能するかにあります。 SqlDependency.Stop()
を呼び出して SqlCommand
と SqlConnection
への参照を解放した後でも、関連付けられた会話グループとエンドポイントはデータベースに残り、メモリを消費し続けます。
クリーンアップ手順
これらの未使用の会話エンドポイントを削除してメモリを解放するには、データベースに対して次の SQL スクリプトを実行します。
<code class="language-sql">-- Disable conversation groups without index to prepare for endpoint deletion ALTER DATABASE <database_name> SET ALLOW_CONVERSATIONS_WITHOUT_INDEX = OFF; GO -- Remove disconnected conversation endpoints DELETE CEP FROM sys.conversation_endpoints CEP WHERE CEP.state = 'DI' OR CEP.state = 'CD'; GO -- Re-enable conversation groups ALTER DATABASE <database_name> SET ALLOW_CONVERSATIONS_WITHOUT_INDEX = ON; GO</code>
SqlDependency の制限
SqlDependency
には制限があることに注意することが重要です。 特に再サブスクライブする場合、必ずしもすべてのテーブル変更を検出するとは限りません。
より良いアプローチ: SqlDependencyEx
より堅牢な変更追跡については、オープンソースの代替手段である SqlDependencyEx
を検討してください。 このライブラリは、データベース トリガーとサービス ブローカー通知を使用して、テーブル変更をより確実に監視します。 以下に例を示します:
<code class="language-csharp">int changesReceived = 0; using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Simulate table changes MakeTableInsertDeleteChanges(changesCount); // Allow time for changes to be processed Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
以上が期限切れの SqlDependency オブジェクトをクリーンアップして SQL Server メモリを解放するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。