問題:
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中文網其他相關文章!