ホームページ > バックエンド開発 > C++ > SQL Server で古い SqlDependency 接続を効率的に削除するにはどうすればよいですか?

SQL Server で古い SqlDependency 接続を効率的に削除するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-12 12:47:44
オリジナル
149 人が閲覧しました

How Can I Efficiently Purge Stale SqlDependency Connections in SQL Server?

SQL Server のパフォーマンスを最適化するための SqlDependency 接続の管理

SQL Server で SqlDependency オブジェクトを非効率的に管理すると、メモリ リークやパフォーマンスのボトルネックが発生する可能性があります。 この記事では、イベント処理後にこれらのリソースを効果的にクリーンアップする戦略について詳しく説明します。

問題: リソースの蓄積

SqlDependency を使用すると、データベース内に会話グループとエンドポイントが作成されます。 これらのリソースは時間の経過とともに蓄積され、特に SQL Server Express エディションではメモリを使い果たす可能性があります。

データベース クリーンアップ ソリューション

次の 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 は、次の拡張機能を提供します。

  • 信頼性の高い変更追跡: データベース トリガーとサービス ブローカーを使用して、より正確な変更を検出します。
  • 使用例:
<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>
ログイン後にコピー

データベースのクリーンアップ手順を採用するか、SqlDependencyEx に移行することで、SqlDependency リソースを効果的に管理し、メモリの問題を防ぎ、SQL Server のパフォーマンスを最適化できます。

以上がSQL Server で古い SqlDependency 接続を効率的に削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート