首页 >后端开发 >C++ >如何从 SQL Server 内存中清理过期的 SqlDependency 对象?

如何从 SQL Server 内存中清理过期的 SqlDependency 对象?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-12 12:52:46518浏览

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