Maison >développement back-end >C++ >Comment nettoyer les objets SqlDependency expirés de la mémoire SQL Server ?
Résolution des fuites de mémoire causées par les objets SqlDependency dans SQL Server
Les objets SQLDependency, cruciaux pour surveiller les modifications des données SQL Server, peuvent s'accumuler en mémoire, ce qui a un impact négatif sur les performances du serveur. Cet article explique comment supprimer efficacement ces objets expirés.
Comprendre le problème
Lorsqu'un objet SqlDependency déclenche un événement, un nouvel objet est nécessaire pour une surveillance continue. L'ancien objet reste cependant en mémoire, ce qui peut conduire à un épuisement des ressources.
Procédure de nettoyage de la mémoire
Le script SQL suivant identifie et met fin aux points de terminaison de conversation inactifs, libérant ainsi la mémoire consommé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>
Ce script cible les points de terminaison de conversation dans un état déconnecté ou annulé.
Une approche alternative : SqlDependencyEx
Pour améliorer les fonctionnalités et éviter les problèmes potentiels inhérents à la classe standard SqlDependency, envisagez d'utiliser SqlDependencyEx, une alternative open source. Cette solution exploite les déclencheurs de base de données et les notifications natives de Service Broker.
Exemple illustratif utilisant SqlDependencyEx
Voici un exemple de code illustrant SqlDependencyEx :
<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 modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
Cela présente la notification de modification en temps réel à l'aide de SqlDependencyEx.
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!