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