Maison > développement back-end > C++ > Comment nettoyer les objets SqlDependency expirés dans SQL Server pour éviter les fuites de mémoire ?

Comment nettoyer les objets SqlDependency expirés dans SQL Server pour éviter les fuites de mémoire ?

Susan Sarandon
Libérer: 2025-01-12 13:01:47
original
398 Les gens l'ont consulté

How to Clean Up Expired SqlDependency Objects in SQL Server to Prevent Memory Leaks?

Résolution des objets SqlDependency expirés dans SQL Server pour éviter les fuites de mémoire

Le problème :

Les objets SqlDependency de SQL Server persistent en mémoire même après leur expiration, ce qui entraîne une utilisation croissante de la mémoire et des pannes potentielles du serveur. Cet article explique comment supprimer de manière proactive ces requêtes persistantes.

Résolution :

Même après avoir utilisé SqlDependency.Stop(), les restes (groupes de conversation et points de terminaison) restent dans la base de données. Pour remédier à cela, exécutez le script SQL suivant :

<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

SqlDependency Lacunes :

Une limitation clé de SqlDependency est sa couverture de notification incomplète pour toutes les modifications de table lors du réabonnement.

Une alternative supérieure : SqlDependencyEx

La bibliothèque open source SqlDependencyEx exploite les déclencheurs de base de données et les notifications de Service Broker pour surmonter les lacunes de SqlDependency. Voici un exemple d'utilisation illustratif :

<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 reception.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);</code>
Copier après la connexion

L'emploi SqlDependencyEx offre une solution plus robuste pour suivre les modifications de table tout en évitant les problèmes liés à la mémoire inhérents à la classe SqlDependency standard.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal