从 SQL Server 内存中清除过期的 SqlDependency 对象
在 SQL Server 中使用 SqlDependency 对象需要仔细管理,以防止过期依赖项导致内存泄漏。本文详细介绍了处理此问题的有效策略。
了解 SqlDependency 的清理限制
SqlDependency 不会自动删除过期的连接。 即使在调用 Stop()
并释放关联的 SqlCommand
和 SqlConnection
对象之后,会话组和端点仍会保留在数据库中。 这种积累会消耗大量的服务器内存。
用于手动清理的 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中文网其他相关文章!