首頁 >後端開發 >C++ >如何從 SQL Server 記憶體中清理過期的 SqlDependency 物件?

如何從 SQL Server 記憶體中清理過期的 SqlDependency 物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-12 12:52:46516瀏覽

How to Clean Up Expired SqlDependency Objects from SQL Server Memory?

解決 SQL Server 中 SqlDependency 物件導致的記憶體洩漏

SqlDependency 物件對於監視 SQL Server 資料變更至關重要​​,可能會在記憶體中累積,從而對伺服器效能產生負面影響。 本文詳細介紹如何有效刪除這些過期物件。

理解問題

當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>

此腳本針對處於斷線或取消狀態的對話端點。

替代方法:SqlDependencyEx

為了改進功能並避免標準 SqlDependency 類別固有的潛在問題,請考慮使用 SqlDependencyEx(一種開源替代方案)。此解決方案利用資料庫觸發器和本機 Service Broker 通知。

使用 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 modifications.
    MakeTableInsertDeleteChanges(changesCount);

    // Allow time for change detection.
    Thread.Sleep(1000);
}

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

這展示了使用 SqlDependencyEx 的即時變更通知。

以上是如何從 SQL Server 記憶體中清理過期的 SqlDependency 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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