ホームページ >データベース >mysql チュートリアル >期限切れの SqlDependency オブジェクトによって引き起こされる SQL Server のメモリ リークを解決する方法

期限切れの SqlDependency オブジェクトによって引き起こされる SQL Server のメモリ リークを解決する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-15 12:00:45768ブラウズ

How to Resolve SQL Server Memory Leaks Caused by Expired SqlDependency Objects?

期限切れの SqlDependency オブジェクトによる SQL Server のメモリ リークに対処する

問題:

SQL Server データベースの変更監視に SqlDependency クラスを利用するアプリケーションでは、メモリ リークが発生する可能性があります。 期限切れの SqlDependency オブジェクトがメモリに蓄積され、システム リソースを使い果たす可能性があります。

根本原因:

SqlDependency はサーバー接続を確立し、テーブル通知を登録します。 依存関係の削除やリソースの解放 (SqlCommandSqlConnection) の後でも、関連する会話グループとエンドポイントはデータベースに残り、メモリを消費します。

解決策: データベースのクリーンアップ

期限切れの SqlDependency オブジェクトによって占有されていたメモリを再利用するには、影響を受けるデータベース内で次の 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 を使用して、より堅牢な通知を実現します。

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

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

以上が期限切れの SqlDependency オブジェクトによって引き起こされる SQL Server のメモリ リークを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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