首页 >后端开发 >C++ >如何有效清除 SQL Server 中过时的 SqlDependency 连接?

如何有效清除 SQL Server 中过时的 SqlDependency 连接?

Barbara Streisand
Barbara Streisand原创
2025-01-12 12:47:44152浏览

How Can I Efficiently Purge Stale SqlDependency Connections in SQL Server?

管理 SqlDependency 连接以获得最佳 SQL Server 性能

SQL Server 中 SqlDependency 对象的低效管理可能会导致内存泄漏和性能瓶颈。 本文详细介绍了在事件处理后有效清理这些资源的策略。

问题:积累资源

使用 SqlDependency 在数据库中创建对话组和端点。 这些资源随着时间的推移而积累,可能会耗尽内存,尤其是在 SQL Server Express 版本中。

数据库清理解决方案

以下 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>

Sql依赖限制

标准 SqlDependency 类有局限性:

  • 不一致的更改检测:它无法可靠地捕获所有表修改。
  • 持久资源:对话组和端点无限期保留,有助于资源积累。

更好的替代方案:SqlDependencyEx

SqlDependencyEx,一个开源库,提供增强的功能:

  • 可靠的变更跟踪:使用数据库触发器和 Service Broker 进行更准确的变更检测。
  • 用法示例:
<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 notification.
    Thread.Sleep(1000);
}

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

通过使用数据库清理程序或迁移到SqlDependencyEx,您可以有效管理SqlDependency资源,防止内存问题并优化SQL Server性能。

以上是如何有效清除 SQL Server 中过时的 SqlDependency 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

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