Maison > base de données > tutoriel mysql > Comment résoudre les fuites de mémoire SQL Server causées par des objets SqlDependency expirés ?

Comment résoudre les fuites de mémoire SQL Server causées par des objets SqlDependency expirés ?

Patricia Arquette
Libérer: 2025-01-15 12:00:45
original
768 Les gens l'ont consulté

How to Resolve SQL Server Memory Leaks Caused by Expired SqlDependency Objects?

Résolution des fuites de mémoire SQL Server provenant d'objets SqlDependency expirés

Le problème :

Les applications utilisant la classe SqlDependency pour la surveillance des modifications de la base de données SQL Server peuvent subir des fuites de mémoire. Les objets SqlDependency expirés s'accumulent en mémoire, épuisant potentiellement les ressources du système.

Cause fondamentale :

SqlDependency établit une connexion au serveur et enregistre les notifications de table. Même après la suppression des dépendances ou la libération des ressources (SqlCommand, SqlConnection), les groupes de conversations et les points de terminaison associés persistent dans la base de données, consommant de la mémoire.

Solution : Nettoyage de la base de données

Pour récupérer la mémoire occupée par les objets SqlDependency expirés, exécutez ce script SQL dans la base de données concerné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>
Copier après la connexion

Limites de SqlDependency :

Au-delà de la gestion de la mémoire, SqlDependency présente des limites inhérentes :

  • Notification de modification incohérente : toutes les modifications de table ne déclenchent pas de notifications.
  • Écart de réabonnement : les modifications lors du réabonnement ne sont pas signalées.

Alternative : Bibliothèque SqlDependencyEx

Pour une fiabilité améliorée et un suivi complet des modifications, pensez à la bibliothèque SqlDependencyEx open source. Il utilise des déclencheurs de base de données et Service Broker pour une notification plus robuste :

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

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

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