Heim > Backend-Entwicklung > C++ > Wie bereinige ich abgelaufene SqlDependency-Objekte und verhindere SQL Server-Speicherlecks?

Wie bereinige ich abgelaufene SqlDependency-Objekte und verhindere SQL Server-Speicherlecks?

Mary-Kate Olsen
Freigeben: 2025-01-12 13:06:45
Original
245 Leute haben es durchsucht

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

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

Das Problem:

Die Speichernutzung von SQL Server kann bei der Verwendung von SqlDependency-Objekten stetig ansteigen. Dies liegt daran, dass die Datenbank auch nach dem Aufruf von SqlDependency.Stop() und der Freigabe von SqlCommand und SqlConnection Konversationsgruppen und Endpunkte beibehält. Diese Anhäufung führt schließlich zu einer Speichererschöpfung, insbesondere in SQL Server Express.

Die Lösung:

Das folgende SQL-Skript bereinigt diese abgelaufenen Konversationsendpunkte:

<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

Führen Sie dieses Skript für die Datenbank aus, bei der der Speicherverlust auftritt.

SqlDependency-Einschränkungen:

Es ist wichtig zu verstehen, dass SqlDependency nicht perfekt ist. Möglicherweise werden einige Tabellenänderungen übersehen, insbesondere solche, die während des Neuabonnementvorgangs auftreten.

Ein besserer Ansatz: SqlDependencyEx

Für eine robustere und zuverlässigere Lösung sollten Sie die Verwendung von SqlDependencyEx in Betracht ziehen, einer Open-Source-Alternative. Es nutzt Datenbankauslöser und Service Broker-Benachrichtigungen für eine effektivere Bearbeitung von Änderungsereignissen. Hier ist ein Beispiel:

<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();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);</code>
Nach dem Login kopieren

SqlDependencyEx bietet eine hervorragende Änderungsverfolgung und eliminiert die Speicherprobleme, die mit dem Standard SqlDependency verbunden sind.

Das obige ist der detaillierte Inhalt vonWie bereinige ich abgelaufene SqlDependency-Objekte und verhindere SQL Server-Speicherlecks?. 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