首頁 >後端開發 >C++ >如何有效清除 SQL Server 中過時的 SqlDependency 連線?

如何有效清除 SQL Server 中過時的 SqlDependency 連線?

Barbara Streisand
Barbara Streisand原創
2025-01-12 12:47:44151瀏覽

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

管理 SqlDependency 連線以獲得最佳 SQL Server 效能

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>

Sql依賴限制

標準 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>

透過使用資料庫清理程式或遷移到SqlDependencyEx,您可以有效管理SqlDependency資源,防止記憶體問題並最佳化SQL Server效能。

以上是如何有效清除 SQL Server 中過時的 SqlDependency 連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn