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