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