Gestion efficace de la mémoire pour les objets SqlDependency de SQL Server
Gérer efficacement l'utilisation de la mémoire des SqlDependency
objets dans SQL Server est crucial pour éviter les problèmes de performances. Ce guide aborde le problème des SqlDependency
objets périmés persistants et propose des solutions.
Le problème : les fuites de mémoire
Même après la gestion des événements et la recréation des objets, SQL Server (en particulier l'édition Express) peut continuer à consommer de la mémoire jusqu'à épuisement. En effet, SqlDependency
laisse derrière lui les groupes de conversation et les points de terminaison, même lorsque les objets associés ne sont plus actifs.
La solution : script SQL pour le nettoyage
Exécutez le script SQL suivant sur la base de données pour supprimer les points de terminaison de conversation inutilisés et récupérer de la mémoire :
<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 parcourt les points de terminaison de la conversation dans un état déconnecté ou fermé et les termine, libérant la mémoire associée.
Limites des dépendances SQL
Il est important d'être conscient des limites de SqlDependency
:
SqlDependency
peut manquer certaines modifications de table, nécessitant un réabonnement, ce qui peut entraîner des mises à jour manquées.Une alternative supérieure : SqlDependencyEx
Pour améliorer SqlDependency
la gestion et surmonter ses limites, pensez à utiliser la bibliothèque SqlDependencyEx
open source. Cette bibliothèque utilise des déclencheurs de base de données et des notifications Service Broker pour une gestion plus fiable des événements :
<code class="language-csharp">using (SqlDependencyEx sqlDependency = new SqlDependencyEx( TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) { sqlDependency.TableChanged += (o, e) => changesReceived++; sqlDependency.Start(); // Perform table modifications. MakeTableInsertDeleteChanges(changesCount); // Allow time for change reception. Thread.Sleep(1000); }</code>
Cet exemple montre comment SqlDependencyEx
simplifie la gestion des événements et fournit une solution plus robuste pour surveiller les modifications de table.
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!