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

如何清理SQL Server中过期的SqlDependency对象以防止内存泄漏?

Susan Sarandon
Susan Sarandon原创
2025-01-12 13:01:47395浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn