Das Problem:
Die SqlDependency
-Objekte von SQL Server bleiben auch nach Ablauf im Speicher bestehen, was zu einer steigenden Speichernutzung und möglichen Serverabstürzen führt. In diesem Artikel wird beschrieben, wie Sie diese verbleibenden Abfragen proaktiv entfernen können.
Auflösung:
Auch nach der Verwendung von SqlDependency.Stop()
verbleiben Reste – Konversationsgruppen und Endpunkte – in der Datenbank. Um dies zu beheben, führen Sie das folgende SQL-Skript aus:
<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
Mängel:
Eine wesentliche Einschränkung von SqlDependency
ist die unvollständige Benachrichtigungsabdeckung für alle Tabellenänderungen während der Erneuerung des Abonnements.
Eine überlegene Alternative: SqlDependencyEx
Die Open-Source-Bibliothek SqlDependencyEx
nutzt Datenbankauslöser und Service Broker-Benachrichtigungen, um die Mängel von SqlDependency
zu beheben. Hier ist ein anschauliches Anwendungsbeispiel:
<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>
Der Einsatz von SqlDependencyEx
bietet eine robustere Lösung zum Verfolgen von Tabellenänderungen und verhindert gleichzeitig die speicherbezogenen Probleme, die der Standardklasse SqlDependency
innewohnen.
Das obige ist der detaillierte Inhalt vonWie bereinige ich abgelaufene SqlDependency-Objekte in SQL Server, um Speicherlecks zu verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!