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

Comment nettoyer les objets SqlDependency expirés et prévenir les fuites de mémoire SQL Server ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 13:06:45246parcourir

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

Résolution des fuites de mémoire SQL Server causées par des objets SqlDependency expirés

Le problème :

L'utilisation de la mémoire de SQL Server peut augmenter régulièrement lors de l'utilisation de SqlDependency objets. En effet, même après avoir appelé SqlDependency.Stop() et libéré SqlCommand et SqlConnection, la base de données conserve les groupes de conversation et les points de terminaison. Cette accumulation conduit finalement à un épuisement de la mémoire, notamment dans SQL Server Express.

La solution :

Le script SQL suivant nettoie ces points de terminaison de conversation expirés :

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

Exécutez ce script sur la base de données connaissant la fuite de mémoire.

Limites de SqlDependency :

Il est important de comprendre que SqlDependency n'est pas parfait. Il se peut qu'il manque certains changements de table, notamment ceux survenant lors de son processus de réabonnement.

Une meilleure approche : SqlDependencyEx

Pour une solution plus robuste et fiable, pensez à utiliser SqlDependencyEx, une alternative open source. Il exploite les déclencheurs de base de données et les notifications de Service Broker pour une gestion plus efficace des événements de modification. Voici un exemple :

<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();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

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

SqlDependencyEx offre un suivi supérieur des modifications et élimine les problèmes de mémoire associés à la norme SqlDependency.

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