Le problème :
Les applications utilisant la classe SqlDependency
pour la surveillance des modifications de la base de données SQL Server peuvent subir des fuites de mémoire. Les objets SqlDependency
expirés s'accumulent en mémoire, épuisant potentiellement les ressources du système.
Cause fondamentale :
SqlDependency
établit une connexion au serveur et enregistre les notifications de table. Même après la suppression des dépendances ou la libération des ressources (SqlCommand
, SqlConnection
), les groupes de conversations et les points de terminaison associés persistent dans la base de données, consommant de la mémoire.
Solution : Nettoyage de la base de données
Pour récupérer la mémoire occupée par les objets SqlDependency
expirés, exécutez ce script SQL dans la base de données concernée :
<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>
Limites de SqlDependency :
Au-delà de la gestion de la mémoire, SqlDependency
présente des limites inhérentes :
Alternative : Bibliothèque SqlDependencyEx
Pour une fiabilité améliorée et un suivi complet des modifications, pensez à la bibliothèque SqlDependencyEx
open source. Il utilise des déclencheurs de base de données et Service Broker pour une notification plus robuste :
<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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!