首頁 > 資料庫 > mysql教程 > 如何有效地從SQL Server記憶體中清除過期的SqlDependency物件?

如何有效地從SQL Server記憶體中清除過期的SqlDependency物件?

DDD
發布: 2025-01-15 11:53:47
原創
450 人瀏覽過

How to Effectively Purge Expired SqlDependency Objects from SQL Server Memory?

從 SQL Server 記憶體清除過期的 SqlDependency 物件

在 SQL Server 中使用 SqlDependency 物件需要仔細管理,以防止過期依賴項導致記憶體洩漏。本文詳細介紹了處理此問題的有效策略。

了解 SqlDependency 的清理限制

SqlDependency 不會自動刪除過期的連線。 即使在呼叫 Stop() 並釋放關聯的 SqlCommandSqlConnection 物件之後,會話群組和端點仍會保留在資料庫中。 這種累積會消耗大量的伺服器記憶體。

手動清理的 SQL 查詢

要手動清除未使用的對話端點和釋放內存,請在資料庫中執行以下 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 類別

考慮使用開源SqlDependencyEx類別。 它利用資料庫觸發器和本機 Service Broker 通知來處理表格變更事件,具有以下優點:

  • 自動清理過期的依賴項。
  • 全面的變更跟踪,包括重新訂閱期間的事件。

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

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

使用這些方法可確保 SqlDependency 物件的高效記憶體管理和最佳 SQL Server 應用程式效能。

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

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