Réduire le temps de chargement d’une page ASP.NET avec le SQL Server Cache Dependency

Un système de cache permet de mettre temporairement des données en mémoire sur le serveur permettant un affichage plus rapide des pages du site web.

En ASP.NET, il existe plusieurs solutions pour créer un système de cache :

  • Output Caching : Une copie de la page web finale (HTML) est stockée sur le serveur. Lors du prochain appel à la page, la copie stockée sera automatiquement rendue au client n’exécutant ainsi pas les requêtes SQL, traitements côté serveur, etc… La copie expirera automatiquement après un temps préalablement configurée ou si le serveur manque de mémoire.
  • Data Caching : Il est possible de stocker en mémoire sur le serveur des données comme un DataSet. Si le DataSet est mis en cache, on évite ainsi un appel à la base de données. Contrairement à l'Output Caching, c’est à vous de définir les objets qui seront mis en cache.

Dans cet article, c’est une partie du Data Caching qui nous intéresse : le SQL Server Cache Dependency. Le principe de cette méthode de caching est de limiter les appels à la base de données en mettant en cache le résultat d’une requête SQL et en l’utilisant tant que la table à qui elle fait appel n’est pas modifiée.

Concrètement si un GridView utilise un SqlDataSource pour récupérer toutes les colonnes de la table MaTable dans une base de données.

  • Sans SQL Cache Dependencies, à chaque exécution de la page, un appel à la base de données sera fait pour récupérer les informations dans la table MaTable.
  • Avec SQL Cache Dependency, lors de la première exécution de la page un appel à la base de données sera fait puis lors de chaque appel le résultat de la requête sera récupéré dans le cache. Si la table vient à être modifiée, un nouvel appel à la base de données sera fait, et ainsi de suite.

Comment mettre en place le SQL Server Cache Dependency

Attention, la mise en place décrite ci-dessous ne fonctionne que sur SQL Server 2005 et plus. Pour SQL Server 2000 le SQL Cache Dependency est possible, mais beaucoup plus lourd à mettre en place.

Premièrement, pour activer les notifications sur SQL Server (qui permettront d’avertir du changement dans une table), démarrer Visual Studio Command Prompt (Démarrer -> Tous les programmes -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt).

Tapez ensuite : SqlCmd -S <Serveur_de_base_de_données>

command_prompt

Entrez ensuite les requêtes suivantes :

USE <Base_de_données>
ALTER DATABASE <Base_de_données> SET ENABLE_BROKER
GO

Attention, pour que cette requête s’exécute avec succès, aucune autre session ne doit être ouverte pour cette base de données.

Il faut ensuite ajouter une entrée dans le web.config pour indiquer que la base de données utilisera le cache :

<system.web>
  <caching>
    <sqlCacheDependency enabled="true">
      <databases>
        <add name="Ma_Base" connectionStringName="Site" pollTime="20000"/>
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>
  • **name **: Nom de la base de données

    • **connectionStringName **: nom de la chaine de connexion définie dans le web.config
  • **pollTime **: temps entre chaque notification (ici 20s)

Il faut ensuite activer les notifications pour la base de données et pour la table concernée. Pour pouvoir accéder à la classe SqlCacheDependencyAdmin, importez System.Web.Caching dans votre page.

string cnx = ConfigurationManager.ConnectionStrings["Site"].ToString();
SqlCacheDependencyAdmin.EnableNotifications(cnx);
SqlCacheDependencyAdmin.EnableTableForNotifications(cnx, "Ma_Table");

Dernière étape, activer le Cache dans les propriétés du **SqlDataSource **ou ObjectDataSource.

cache_datasource

EnableCaching doit être passé à true et SqlCacheDependency doit contenir MaBase:MaTable.

Il faut noter qu’une table AspNet_SqlCacheTablesForChangeNotification est créée pour stocker les changements dans la base de données. A chaque modification le champ changeIdest incrémenté de 1.

Les performances

Pour démontrer les performances de ce système de cache, j’ai fait des tests sur une requête SQL qui récupère les 34487 villes de France. Le test se base sur 10 exécutions de page dans les 2 cas et avec une désactivation du cache du navigateur.

Sans cache, l’exécution moyenne des pages est de 0,4825s alors qu’avec le cache, on obtient une exécution moyenne de 0,0284s soit une exécution 17 fois inférieure.

resultat


Voir également