管理 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
,一个开源库,提供增强的功能:
<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中文网其他相关文章!