ホームページ >データベース >mysql チュートリアル >SQL Server でのメモリ リークを回避するために SqlDependency オブジェクトを効率的に管理するにはどうすればよいですか?

SQL Server でのメモリ リークを回避するために SqlDependency オブジェクトを効率的に管理するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-15 11:32:44471ブラウズ

How Can I Efficiently Manage SqlDependency Objects to Avoid Memory Leaks in SQL Server?

メモリ リークを防ぐために SQL Server の SqlDependency オブジェクト管理を最適化する

質問: SQL Server でのメモリの枯渇を防ぐために SqlDependency オブジェクトを効果的に管理するにはどうすればよいですか?

答え:

Microsoft の SqlDependency 実装は、大量のメモリ消費につながる可能性のある動作を示します。SqlDependency.Stop() を呼び出し、SqlCommandSqlConnection を解放した後でも、データベースは会話グループ (sys.conversation_groups) とエンドポイント (sys.conversation_endpoints)。 SQL Server はすべてのエンドポイントをロードしているようで、メモリの問題が発生する可能性があります。

これを解決するには、データベースで次の 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 には、特に再サブスクリプション中にすべてのテーブル変更を確実にキャプチャする際に制限があります。

推奨される代替案: SqlDependencyEx

より優れた代替手段は、オープンソースの SqlDependencyEx クラスです。 データベース トリガーと Service Broker 通知を使用して、より堅牢な変更追跡を実現します。 以下に例を示します:

<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 change detection
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);</code>

SqlDependencyEx は、標準の SqlDependency と比較して信頼性、効率、メモリ管理が向上し、正確な変更追跡を保証し、メモリの問題を防ぎます。

以上がSQL Server でのメモリ リークを回避するために SqlDependency オブジェクトを効率的に管理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。