Maison >développement back-end >C++ >Comment nettoyer les objets SqlDependency expirés et prévenir les fuites de mémoire SQL Server ?
Résolution des fuites de mémoire SQL Server causées par des objets SqlDependency expirés
Le problème :
L'utilisation de la mémoire de SQL Server peut augmenter régulièrement lors de l'utilisation de SqlDependency
objets. En effet, même après avoir appelé SqlDependency.Stop()
et libéré SqlCommand
et SqlConnection
, la base de données conserve les groupes de conversation et les points de terminaison. Cette accumulation conduit finalement à un épuisement de la mémoire, notamment dans SQL Server Express.
La solution :
Le script SQL suivant nettoie ces points de terminaison de conversation expirés :
<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>
Exécutez ce script sur la base de données connaissant la fuite de mémoire.
Limites de SqlDependency :
Il est important de comprendre que SqlDependency
n'est pas parfait. Il se peut qu'il manque certains changements de table, notamment ceux survenant lors de son processus de réabonnement.
Une meilleure approche : SqlDependencyEx
Pour une solution plus robuste et fiable, pensez à utiliser SqlDependencyEx
, une alternative open source. Il exploite les déclencheurs de base de données et les notifications de Service Broker pour une gestion plus efficace des événements de modification. 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(); // Make table changes. MakeTableInsertDeleteChanges(changesCount); // Wait a little bit to receive all changes. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
offre un suivi supérieur des modifications et élimine les problèmes de mémoire associés à la norme SqlDependency
.
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!