Effektive Speicherverwaltung für die SqlDependency-Objekte von SQL Server
Eine effiziente Verwaltung der Speichernutzung von SqlDependency
Objekten in SQL Server ist entscheidend, um Leistungsprobleme zu vermeiden. Dieser Leitfaden befasst sich mit dem Problem verbleibender abgelaufener SqlDependency
Objekte und bietet Lösungen.
Das Problem: Speicherlecks
Selbst nach der Ereignisbehandlung und Objektwiederherstellung verbraucht SQL Server (insbesondere die Express Edition) möglicherweise weiterhin Speicher, bis er erschöpft ist. Dies liegt daran, dass SqlDependency
Konversationsgruppen und Endpunkte hinterlässt, auch wenn die zugehörigen Objekte nicht mehr aktiv sind.
Die Lösung: SQL-Skript zur Bereinigung
Führen Sie das folgende SQL-Skript für die Datenbank aus, um nicht verwendete Konversationsendpunkte zu entfernen und Speicher freizugeben:
<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 durchläuft Konversationsendpunkte im getrennten oder geschlossenen Zustand und beendet sie, wodurch der zugehörige Speicher freigegeben wird.
SqlDependency-Einschränkungen
Es ist wichtig, sich der Einschränkungen von SqlDependency
bewusst zu sein:
SqlDependency
Möglicherweise werden einige Tabellenänderungen übersehen, sodass ein erneutes Abonnement erforderlich ist, was zu verpassten Aktualisierungen führen kann.Eine überlegene Alternative: SqlDependencyEx
Für eine verbesserte SqlDependency
Verwaltung und die Überwindung ihrer Einschränkungen sollten Sie die Verwendung der Open-Source-SqlDependencyEx
-Bibliothek in Betracht ziehen. Diese Bibliothek verwendet Datenbank-Trigger und Service Broker-Benachrichtigungen für eine zuverlässigere Ereignisbehandlung:
<code class="language-csharp">using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Perform table modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change reception. Thread.Sleep(1000); }</code>
Dieses Beispiel zeigt, wie SqlDependencyEx
die Ereignisbehandlung vereinfacht und eine robustere Lösung für die Überwachung von Tabellenänderungen bietet.
Das obige ist der detaillierte Inhalt vonWie bereinige ich den von abgelaufenen SqlDependency-Objekten verwendeten SQL Server-Speicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!