解決 SQL Server 中 SqlDependency 物件導致的記憶體洩漏
SqlDependency 物件對於監視 SQL Server 資料變更至關重要,可能會在記憶體中累積,從而對伺服器效能產生負面影響。 本文詳細介紹如何有效刪除這些過期物件。
理解問題
當SqlDependency物件觸發事件時,需要一個新的物件來繼續監控。 然而,舊物件仍保留在記憶體中,可能會導致資源耗盡。
記憶體清理過程
以下 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
為了改進功能並避免標準 SqlDependency 類別固有的潛在問題,請考慮使用 SqlDependencyEx(一種開源替代方案)。此解決方案利用資料庫觸發器和本機 Service Broker 通知。
使用 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 modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
這展示了使用 SqlDependencyEx 的即時變更通知。
以上是如何從 SQL Server 記憶體中清理過期的 SqlDependency 物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!