Heim >Backend-Entwicklung >C++ >Wie bereinige ich abgelaufene SqlDependency-Objekte aus dem SQL Server-Speicher?

Wie bereinige ich abgelaufene SqlDependency-Objekte aus dem SQL Server-Speicher?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-12 12:52:46521Durchsuche

How to Clean Up Expired SqlDependency Objects from SQL Server Memory?

Behebung von Speicherlecks, die durch SqlDependency-Objekte in SQL Server verursacht werden

SqlDependency-Objekte, die für die Überwachung von SQL Server-Datenänderungen von entscheidender Bedeutung sind, können sich im Speicher ansammeln und sich negativ auf die Serverleistung auswirken. In diesem Artikel erfahren Sie, wie Sie diese abgelaufenen Objekte effektiv entfernen.

Das Problem verstehen

Wenn ein SqlDependency-Objekt ein Ereignis auslöst, ist ein neues Objekt für die weitere Überwachung erforderlich. Das alte Objekt verbleibt jedoch im Speicher, was möglicherweise zur Erschöpfung der Ressourcen führt.

Speicherbereinigungsverfahren

Das folgende SQL-Skript identifiziert und beendet inaktive Konversationsendpunkte und gibt den verbrauchten Speicher frei:

<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>

Dieses Skript zielt auf Konversationsendpunkte ab, die sich im getrennten oder abgebrochenen Zustand befinden.

Ein alternativer Ansatz: SqlDependencyEx

Um die Funktionalität zu verbessern und mögliche Probleme der Standardklasse SqlDependency zu vermeiden, sollten Sie die Verwendung von SqlDependencyEx, einer Open-Source-Alternative, in Betracht ziehen. Diese Lösung nutzt Datenbank-Trigger und native Service Broker-Benachrichtigungen.

Anschauliches Beispiel mit SqlDependencyEx

Hier ist ein Codebeispiel, das SqlDependencyEx demonstriert:

<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>

Dies zeigt Echtzeit-Änderungsbenachrichtigungen mit SqlDependencyEx.

Das obige ist der detaillierte Inhalt vonWie bereinige ich abgelaufene SqlDependency-Objekte aus dem SQL Server-Speicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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