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

Comment nettoyer les objets SqlDependency expirés de la mémoire SQL Server ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 12:52:46518parcourir

How to Clean Up Expired SqlDependency Objects from SQL Server Memory?

Résolution des fuites de mémoire causées par les objets SqlDependency dans SQL Server

Les objets SQLDependency, cruciaux pour surveiller les modifications des données SQL Server, peuvent s'accumuler en mémoire, ce qui a un impact négatif sur les performances du serveur. Cet article explique comment supprimer efficacement ces objets expirés.

Comprendre le problème

Lorsqu'un objet SqlDependency déclenche un événement, un nouvel objet est nécessaire pour une surveillance continue. L'ancien objet reste cependant en mémoire, ce qui peut conduire à un épuisement des ressources.

Procédure de nettoyage de la mémoire

Le script SQL suivant identifie et met fin aux points de terminaison de conversation inactifs, libérant ainsi la mémoire consommée :

<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>

Ce script cible les points de terminaison de conversation dans un état déconnecté ou annulé.

Une approche alternative : SqlDependencyEx

Pour améliorer les fonctionnalités et éviter les problèmes potentiels inhérents à la classe standard SqlDependency, envisagez d'utiliser SqlDependencyEx, une alternative open source. Cette solution exploite les déclencheurs de base de données et les notifications natives de Service Broker.

Exemple illustratif utilisant SqlDependencyEx

Voici un exemple de code illustrant 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 modifications.
    MakeTableInsertDeleteChanges(changesCount);

    // Allow time for change detection.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);</code>

Cela présente la notification de modification en temps réel à l'aide de SqlDependencyEx.

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!

Déclaration:
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