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

如何清理SQL Server中過期的SqlDependency物件以防止記憶體洩漏?

Susan Sarandon
發布: 2025-01-12 13:01:47
原創
397 人瀏覽過

How to Clean Up Expired SqlDependency Objects in SQL Server to Prevent Memory Leaks?

解決 SQL Server 中過期的 SqlDependency 物件以避免記憶體洩漏

問題:

SQL Server 的 SqlDependency 物件即使在過期後仍會保留在記憶體中,導致記憶體使用量不斷增加且潛在的伺服器崩潰。 本文概述如何主動刪除這些揮之不去的查詢。

解:

即使使用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>
登入後複製

SqlDependency缺點:

SqlDependency 的一個關鍵限制是其對重新訂閱期間所有表格修改的通知覆蓋範圍不完整。

更好的選擇:SqlDependencyEx

開源SqlDependencyEx函式庫利用資料庫觸發器和Service Broker通知來克服SqlDependency的缺點。 這是一個說明性的使用範例:

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

Assert.AreEqual(changesCount, changesReceived);</code>
登入後複製

使用 SqlDependencyEx 提供了更強大的解決方案來追蹤表更改,同時防止標準 SqlDependency 類別中固有的記憶體相關問題。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板