Optimisation de la gestion des objets SqlDependency dans SQL Server pour éviter les fuites de mémoire
Question : Comment puis-je gérer efficacement SqlDependency
les objets pour éviter l'épuisement de la mémoire dans SQL Server ?
Réponse :
L'implémentation SqlDependency
de Microsoft présente un comportement qui peut conduire à une consommation de mémoire importante : même après avoir appelé SqlDependency.Stop()
, libéré SqlCommand
et SqlConnection
, la base de données conserve les groupes de conversation (sys.conversation_groups
) et les points de terminaison (sys.conversation_endpoints
). SQL Server semble charger tous les points de terminaison, ce qui peut entraîner des problèmes de mémoire.
Pour résoudre ce problème, exécutez le script SQL suivant sur votre base de données :
<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>
De plus, SqlDependency
présente des limites dans la capture fiable de toutes les modifications de table, en particulier lors du réabonnement.
Alternative recommandée : SqlDependencyEx
Une alternative supérieure est la classe SqlDependencyEx
open source. Il utilise des déclencheurs de base de données et des notifications Service Broker pour un suivi des modifications plus robuste. 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 change detection Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
SqlDependencyEx
offre une fiabilité, une efficacité et une gestion de la mémoire améliorées par rapport à la norme SqlDependency
, garantissant un suivi précis des modifications et évitant les problèmes de mémoire.
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!