Effacer les objets SqlDependency inutilisés dans SQL Server pour libérer de la mémoire
La gestion de la mémoire de SQL Server peut être affectée par une accumulation d'objets SqlDependency
expirés, entraînant une consommation élevée de mémoire par le processus SQL Server. Cela peut avoir un impact important sur les performances, en particulier dans SQL Server Express, provoquant potentiellement un épuisement de la mémoire et des pannes d'applications.
Résoudre le problème
Le principal problème réside dans le fonctionnement SqlDependency
de Microsoft. Même après avoir appelé SqlDependency.Stop()
et publié les références à SqlCommand
et SqlConnection
, les groupes de conversation et les points de terminaison associés persistent dans la base de données, continuant à consommer de la mémoire.
Étapes de nettoyage
Pour supprimer ces points de terminaison de conversation inutilisés et libérer de la mémoire, exécutez ce script SQL sur votre base de données :
<code class="language-sql">-- Disable conversation groups without index to prepare for endpoint deletion ALTER DATABASE <database_name> SET ALLOW_CONVERSATIONS_WITHOUT_INDEX = OFF; GO -- Remove disconnected conversation endpoints DELETE CEP FROM sys.conversation_endpoints CEP WHERE CEP.state = 'DI' OR CEP.state = 'CD'; GO -- Re-enable conversation groups ALTER DATABASE <database_name> SET ALLOW_CONVERSATIONS_WITHOUT_INDEX = ON; GO</code>
Limites des dépendances SQL
Il est important de noter que SqlDependency
a des limites. Il ne détecte pas toujours tous les changements de table, notamment lors d'une réinscription.
Une meilleure approche : SqlDependencyEx
Pour un suivi des modifications plus robuste, envisagez l'alternative open source, SqlDependencyEx
. Cette bibliothèque utilise des déclencheurs de base de données et des notifications Service Broker pour une surveillance plus fiable des modifications de table. Voici un exemple :
<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 changes to be processed 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!