Maison > base de données > tutoriel mysql > Comment optimiser l'utilisation de la mémoire SQL Server lors de l'utilisation de SqlDependency ?

Comment optimiser l'utilisation de la mémoire SQL Server lors de l'utilisation de SqlDependency ?

DDD
Libérer: 2025-01-15 12:22:43
original
151 Les gens l'ont consulté

How to Optimize SQL Server Memory Usage When Using SqlDependency?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal