ホームページ >データベース >mysql チュートリアル >SqlDependency を使用するときに SQL Server のメモリ使用量を最適化する方法

SqlDependency を使用するときに SQL Server のメモリ使用量を最適化する方法

DDD
DDDオリジナル
2025-01-15 12:22:43144ブラウズ

How to Optimize SQL Server Memory Usage When Using SqlDependency?

SqlDependency を使用した SQL Server のメモリ使用量の最適化

課題:

SQL Server の SqlDependency クラスを使用すると、メモリ リークが発生することがよくあります。 未使用の SqlDependency オブジェクトが蓄積すると、リソースの大量消費と潜在的なメモリ枯渇につながり、特に SQL Server Express で顕著です。 これらの古い依存関係を効率的に削除することが、最適なパフォーマンスを維持する鍵となります。

解決策:

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>

優れた代替手段: SqlDependencyEx

標準の SqlDependency クラスには制限があり、特に再サブスクリプション中にすべてのテーブルの変更を確実に追跡することができません。 より堅牢な代替手段は、データベース トリガーとネイティブの Service Broker 通知を利用するオープンソース ソリューションである SqlDependencyEx です。 これにより、より信頼性の高い変更通知が提供され、Microsoft の実装に固有のメモリの問題が回避されます。

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

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

このアプローチにより、データ変更のタイムリーな通知が保証され、組み込みの SqlDependency クラスに関連するメモリの問題が効果的に軽減されます。

以上がSqlDependency を使用するときに SQL Server のメモリ使用量を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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