問題:
SQL Server の SqlDependency
オブジェクトは有効期限が切れた後もメモリ内に残り、メモリ使用量が増加し、サーバーがクラッシュする可能性があります。 この記事では、これらの残留クエリを積極的に削除する方法について概要を説明します。
解決策:
SqlDependency.Stop()
を採用した後でも、残りの部分 (会話グループとエンドポイント) はデータベース内に残ります。 これを修正するには、次の SQL スクリプトを実行します:
<code class="language-sql">DECLARE @ConvHandle uniqueidentifier DECLARE Conv CURSOR FOR SELECT CEP.conversation_handle FROM sys.conversation_endpoints CEP WHERE CEP.state = 'DI' or CEP.state = 'CD' OPEN Conv; FETCH NEXT FROM Conv INTO @ConvHandle; WHILE (@@FETCH_STATUS = 0) BEGIN END CONVERSATION @ConvHandle WITH CLEANUP; FETCH NEXT FROM Conv INTO @ConvHandle; END CLOSE Conv; DEALLOCATE Conv;</code>
SqlDependency
欠点:
SqlDependency
の主な制限は、再サブスクリプション中のすべてのテーブル変更に対する通知範囲が不完全であることです。
優れた代替案: SqlDependencyEx
オープンソースの SqlDependencyEx
ライブラリは、データベース トリガーと Service Broker 通知を利用して SqlDependency
の欠点を克服します。 以下に使用例を示します:
<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 modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change reception. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
を採用すると、標準の SqlDependency
クラスに固有のメモリ関連の問題を回避しながら、テーブルの変更を追跡するためのより堅牢なソリューションが提供されます。
以上がSQL Server で期限切れの SqlDependency オブジェクトをクリーンアップしてメモリ リークを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。