Optimisation de l'utilisation de la mémoire SQL Server avec SqlDependency
Le défi :
L'utilisation de la classe SqlDependency
de SQL Server entraîne souvent une fuite de mémoire. Les objets SqlDependency
inutilisés s'accumulent, entraînant une consommation élevée de ressources et un épuisement potentiel de la mémoire, particulièrement visible dans SQL Server Express. La suppression efficace de ces dépendances obsolètes est essentielle pour maintenir des performances optimales.
La solution :
Arrêter simplement les dépendances avec SqlDependency.Stop()
n'est pas suffisant ; les groupes de conversation et les points de terminaison restent dans la base de données. Pour résoudre ce problème, exécutez le script SQL suivant pour nettoyer ces ressources persistantes :
<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>
Une alternative supérieure : SqlDependencyEx
La classe SqlDependency
standard présente des limites, notamment son incapacité à suivre de manière fiable toutes les modifications de table lors du réabonnement. Une alternative plus robuste est SqlDependencyEx
, une solution open source utilisant des déclencheurs de base de données et des notifications natives de Service Broker. Cela fournit des notifications de modifications plus fiables et évite les problèmes de mémoire inhérents à l'implémentation de Microsoft.
Voici un exemple utilisant 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 changes. MakeTableInsertDeleteChanges(changesCount); // Allow time for change detection. Thread.Sleep(1000); } Assert.AreEqual(changesCount, changesReceived);</code>
Cette approche garantit une notification rapide des modifications de données et atténue efficacement les problèmes de mémoire associés à la classe SqlDependency
intégrée.
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!