Maison >base de données >tutoriel mysql >Comment purger efficacement les objets SqlDependency expirés de la mémoire SQL Server ?

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

DDD
DDDoriginal
2025-01-15 11:53:47451parcourir

How to Effectively Purge Expired SqlDependency Objects from SQL Server Memory?

Effacer les objets SqlDependency expirés de la mémoire SQL Server

L'utilisation d'objets SqlDependency dans SQL Server nécessite une gestion minutieuse pour éviter les fuites de mémoire dues aux dépendances expirées. Cet article détaille les stratégies efficaces pour gérer cela.

Comprendre les limites du nettoyage de SqlDependency

SqlDependency ne supprime pas automatiquement les connexions expirées. Même après que Stop() est appelé et que les objets SqlCommand et SqlConnection associés sont libérés, les groupes de conversation et les points de terminaison persistent dans la base de données. Cette accumulation consomme une mémoire serveur importante.

Requête SQL pour le nettoyage manuel

Pour effacer manuellement les points de terminaison de conversation inutilisés et libérer de la mémoire, exécutez ce code SQL dans 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>

Alternative : la classe SqlDependencyEx

Envisagez d'utiliser la classe SqlDependencyEx open source. Il exploite les déclencheurs de base de données et les notifications natives de Service Broker pour les événements de modification de table, offrant plusieurs avantages :

  • Nettoyage automatique des dépendances expirées.
  • Suivi complet des modifications, y compris les événements lors du réabonnement.

Exemple d'utilisation de 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 processing.
    Thread.Sleep(1000);
}

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

L'utilisation de ces méthodes garantit une gestion efficace de la mémoire pour les objets SqlDependency et des performances optimales des applications SQL Server.

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