Heim > Backend-Entwicklung > C++ > Wie bereinige ich abgelaufene SqlDependency-Objekte in SQL Server, um Speicherlecks zu verhindern?

Wie bereinige ich abgelaufene SqlDependency-Objekte in SQL Server, um Speicherlecks zu verhindern?

Susan Sarandon
Freigeben: 2025-01-12 13:01:47
Original
394 Leute haben es durchsucht

How to Clean Up Expired SqlDependency Objects in SQL Server to Prevent Memory Leaks?

Adressierung abgelaufener SqlDependency-Objekte in SQL Server zur Vermeidung von Speicherlecks

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>
Nach dem Login kopieren

SqlDependencyMä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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage