Heim >Datenbank >MySQL-Tutorial >Wie behebt man SQL Server-Speicherlecks, die durch abgelaufene SqlDependency-Objekte verursacht werden?
Das Problem:
Bei Anwendungen, die die Klasse SqlDependency
für die Überwachung von SQL Server-Datenbankänderungen verwenden, kann es zu Speicherverlusten kommen. Abgelaufene SqlDependency
Objekte sammeln sich im Speicher an und erschöpfen möglicherweise die Systemressourcen.
Grundursache:
SqlDependency
stellt eine Serververbindung her und registriert Tischbenachrichtigungen. Auch nach dem Entfernen der Abhängigkeit oder der Ressourcenfreigabe (SqlCommand
, SqlConnection
) verbleiben zugehörige Konversationsgruppen und Endpunkte in der Datenbank und verbrauchen Speicher.
Lösung: Datenbankbereinigung
Um den von abgelaufenen SqlDependency
Objekten belegten Speicher zurückzugewinnen, führen Sie dieses SQL-Skript in der betroffenen 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>
SqlDependency-Einschränkungen:
Über die Speicherverwaltung hinaus SqlDependency
gibt es inhärente Einschränkungen:
Alternative: SqlDependencyEx-Bibliothek
Für eine verbesserte Zuverlässigkeit und eine umfassende Änderungsverfolgung sollten Sie die Open-Source-SqlDependencyEx
-Bibliothek in Betracht ziehen. Es verwendet Datenbank-Trigger und Service Broker für eine robustere Benachrichtigung:
<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 notification. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
Das obige ist der detaillierte Inhalt vonWie behebt man SQL Server-Speicherlecks, die durch abgelaufene SqlDependency-Objekte verursacht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!