Maison > base de données > tutoriel mysql > Comment puis-je gérer efficacement les objets SqlDependency pour éviter les fuites de mémoire dans SQL Server ?

Comment puis-je gérer efficacement les objets SqlDependency pour éviter les fuites de mémoire dans SQL Server ?

Susan Sarandon
Libérer: 2025-01-15 11:32:44
original
513 Les gens l'ont consulté

How Can I Efficiently Manage SqlDependency Objects to Avoid Memory Leaks in SQL Server?

Optimisation de la gestion des objets SqlDependency dans SQL Server pour éviter les fuites de mémoire

Question : Comment puis-je gérer efficacement SqlDependency les objets pour éviter l'épuisement de la mémoire dans SQL Server ?

Réponse :

L'implémentation SqlDependency de Microsoft présente un comportement qui peut conduire à une consommation de mémoire importante : même après avoir appelé SqlDependency.Stop(), libéré SqlCommand et SqlConnection, la base de données conserve les groupes de conversation (sys.conversation_groups) et les points de terminaison (sys.conversation_endpoints). SQL Server semble charger tous les points de terminaison, ce qui peut entraîner des problèmes de mémoire.

Pour résoudre ce problème, exécutez le script SQL suivant sur 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>
Copier après la connexion

De plus, SqlDependency présente des limites dans la capture fiable de toutes les modifications de table, en particulier lors du réabonnement.

Alternative recommandée : SqlDependencyEx

Une alternative supérieure est la classe SqlDependencyEx open source. Il utilise des déclencheurs de base de données et des notifications Service Broker pour un suivi des modifications plus robuste. 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();

    // Simulate table changes
    MakeTableInsertDeleteChanges(changesCount);

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

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

SqlDependencyEx offre une fiabilité, une efficacité et une gestion de la mémoire améliorées par rapport à la norme SqlDependency, garantissant un suivi précis des modifications et évitant les problèmes de mémoire.

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