Löschen abgelaufener SqlDependency-Objekte aus dem SQL Server-Speicher
Die Verwendung von SqlDependency-Objekten in SQL Server erfordert eine sorgfältige Verwaltung, um Speicherlecks durch abgelaufene Abhängigkeiten zu verhindern. In diesem Artikel werden wirksame Strategien zur Bewältigung dieses Problems beschrieben.
Grundlegendes zu den Bereinigungseinschränkungen von SqlDependency
SqlDependency entfernt abgelaufene Verbindungen nicht automatisch. Auch nachdem Stop()
aufgerufen und zugeordnete SqlCommand
- und SqlConnection
-Objekte freigegeben wurden, bleiben Konversationsgruppen und Endpunkte in der Datenbank bestehen. Diese Anhäufung verbraucht erheblichen Serverspeicher.
SQL-Abfrage für manuelle Bereinigung
Um nicht verwendete Konversationsendpunkte manuell zu löschen und Speicher freizugeben, führen Sie diesen SQL-Code in Ihrer Datenbank 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>
Alternative: Die SqlDependencyEx-Klasse
Erwägen Sie die Verwendung der Open-Source-SqlDependencyEx
-Klasse. Es nutzt Datenbankauslöser und native Service Broker-Benachrichtigungen für Tabellenänderungsereignisse und bietet mehrere Vorteile:
Beispiel für die Verwendung von SqlDependencyEx
<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 changes. MakeTableInsertDeleteChanges(changesCount); // Allow time for change processing. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
Der Einsatz dieser Methoden gewährleistet eine effiziente Speicherverwaltung für SqlDependency-Objekte und eine optimale SQL Server-Anwendungsleistung.
Das obige ist der detaillierte Inhalt vonWie kann man abgelaufene SqlDependency-Objekte effektiv aus dem SQL Server-Speicher löschen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!