Optimierung der SqlDependency-Objektverwaltung in SQL Server zur Vermeidung von Speicherlecks
Frage: Wie kann ich SqlDependency
Objekte effektiv verwalten, um eine Speichererschöpfung in SQL Server zu verhindern?
Antwort:
Microsofts SqlDependency
-Implementierung weist ein Verhalten auf, das zu einem erheblichen Speicherverbrauch führen kann: Auch nach dem Aufruf von SqlDependency.Stop()
und der Freigabe von SqlCommand
und SqlConnection
behält die Datenbank Konversationsgruppen (sys.conversation_groups
) und Endpunkte (sys.conversation_endpoints
). SQL Server scheint alle Endpunkte zu laden, was möglicherweise zu Speicherproblemen führt.
Um dieses Problem zu beheben, führen Sie das folgende SQL-Skript 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>
Darüber hinaus SqlDependency
gibt es Einschränkungen bei der zuverlässigen Erfassung aller Tabellenänderungen, insbesondere während der erneuten Anmeldung.
Empfohlene Alternative: SqlDependencyEx
Eine überlegene Alternative ist die Open-Source-SqlDependencyEx
-Klasse. Es verwendet Datenbank-Trigger und Service Broker-Benachrichtigungen für eine robustere Änderungsverfolgung. 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(); // Simulate table changes MakeTableInsertDeleteChanges(changesCount); // Allow time for change detection Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
bietet im Vergleich zum Standard eine verbesserte Zuverlässigkeit, Effizienz und Speicherverwaltung SqlDependency
, wodurch eine genaue Änderungsverfolgung gewährleistet und Speicherprobleme verhindert werden.
Das obige ist der detaillierte Inhalt vonWie kann ich SqlDependency-Objekte effizient verwalten, um Speicherlecks in SQL Server zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!