Synchroniser le cache distribué avec la base de données via l'interrogation

Introduction

NCache est une solution de mise en cache distribuée qui permet d'accélérer vos applications tout en réduisant les déplacements coûteux vers la base de données. Cela ajoute à son tour à l'évolutivité car un grand nombre de clients sont déplacés de la base de données vers le cache, ce qui réduit la charge sur votre base de données et élimine le besoin de mettre à niveau votre matériel.

Lorsque des données sont ajoutées dans un cache, vous placez en fait une copie des données d'origine de la base de données dans le cache. Lorsqu'une donnée particulière de votre base de données est mise à jour, sa copie dans le cache reste inchangée et devient donc obsolète. Cependant, cette situation se produit uniquement lorsque plusieurs applications mettent à jour les mêmes données dans la base de données, mais que toutes ne prennent pas la responsabilité de mettre à jour les données dans le cache.

Dans une telle situation, lorsque certaines applications mettent à jour les données de la base de données mais ne mettent pas à jour le cache, vous avez besoin d'un moyen de synchroniser votre cache avec une base de données afin que toute modification des données de la base de données affecte également les données du cache. Cela peut être réalisé soit en activant les notifications d'événements, soit en interrogeant la base de données pour rechercher des mises à jour. Toutefois, si votre application utilise l'une des bases de données telles que SQL Server 2000, une ancienne version d'Oracle ou une autre base de données compatible OLEDB qui ne prend pas en charge les notifications d'événements, la seule méthode de synchronisation avec elle consiste à utiliser l'interrogation.

Plus loin dans cet article, nous étudierons comment NCache synchronise le cache avec une base de données à l'aide de l'interrogation.

Utilisation de DbDependency dans le code

Voici un exemple de code que vous devez implémenter dans votre application afin de synchroniser votre base de données avec le cache via l'interrogation.

String conString = "Provider=OraOLEDB.Oracle;User Id=SYSTEM;" +
"Password=xe;Data Source=xe;OLEDB.NET=true;";

OleDbConnection con = new OleDbConnection(conString);
con.Open();

String sqlCmd = "SELECT ProductID, ProductName FROM dbo.Products WHERE ProductID < 12";

OleDbCommand cmd = new OleDbCommand(sqlCmd,con);
cmd.ExecuteReader();

OleDbDataReader myReader = cmd.ExecuteReader();

List<Products> lstProducts = new List<Products>();
while (myReader.Read())
    {
        Products cProducts = new Products();
        cProducts.ProductID = myReader.GetInt32(0);
        cProducts.ProductName = myReader.GetString(1);
        cProducts.SupplierID = myReader.GetInt32(2);
        cProducts.UnitPrice = myReader.GetDecimal(4);

        CacheItem item = new CacheItem(cProducts);

        DBCacheDependency dependency =
        DBDependencyFactory.CreateOleDbCacheDependency(conString,"");

        _cache.Insert(cProducts.ProductID + ":dbo.Products", cProducts,
        dependency, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
        CacheItemPriority.Default);

        lstProducts.Add(cProducts);
    };
myReader.Close();
con.Close();

Dans le code ci-dessus, une seule ligne de la base de données est chargée et convertie en objet. Plus tard, CreateOleDbCacheDependency est utilisé pour établir une connexion avec la base de données et enregistrer les lignes pour lesquelles NCache devrait rechercher des mises à jour. Notez que lorsque vous créez une dépendance OleDB à l'aide de CreateOleDbCacheDependency, vous devez lui fournir la même instruction SQL que celle que vous avez utilisée précédemment dans le code pour récupérer la ligne particulière.

Une fois le code ci-dessus implémenté et exécuté, le NCache continuera à accéder à la base de données après chaque intervalle de nettoyage spécifié et récupérera toutes les lignes mises à jour, puis les remplacera par les lignes expirées correspondantes dans le cache.

Configuration de la base de données

Nous avons déjà vu dans le code ci-dessus comment NCache implémente la synchronisation avec la base de données. Cependant, la procédure d'activation de la synchronisation basée sur l'interrogation nécessite quelques étapes supplémentaires, que nous verrons ci-dessous.

  1. Créer un tableau 'ncache_db_sync' dans votre base de données Oracle et ajoutez quatre champs : (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) NUMBER modifié et (4) work_in_progress NUMBER.
  2. Voici le SQL pour créer la table :

    Create table ncache_db_sync
        (
            cache_key varchar2(256) not null enable,
            cache_id varchar2(256) not null enable,
            modified number(2,1) default 0 not null enable,
            work_in_progress number(2,1) default 0 not null enable,
            primary key (cache_key, cache_id) enable
        );
  3. Créez des déclencheurs UPDATE et DELETE pour chaque table sur laquelle une notification est requise. Les déclencheurs seront utilisés pour définir le champ 'modifié' de la ligne correspondante dans le ncachetable _db_sync à 1.
  4. /*Here is the SQL to create the trigger:*/
    Create Trigger MyTrigger
    After
    Update [or delete] on dbo.Products
    Referencing OLD AS oldRow
    For each row
     
     Begin
     Update ncache_db_sync
     Set modified = 1
     Where cache_key = (Cast(Select oldRow.ProductID FROM deleted OLD) As VarChar)
    + ':dbo.Products'
    End Trigger;

Remarque: cache_key doit être la même clé que celle utilisée pour ajouter l'enregistrement correspondant dans le cache.

La façon dont les déclencheurs et le 'ncache_db_sync' fonctionne est que chaque fois qu'une valeur dans la table de base de données est modifiée ou supprimée, le déclencheur approprié est automatiquement appelé. Le déclencheur changera la valeur du champ 'modifié' du 'ncache_db_sync' à 1, indiquant que la valeur de la clé primaire a été modifiée.

La NCache effectue le nettoyage des éléments expirés et inutiles dans le cache après chaque période spécifiée. Cette période est appelée intervalle propre. À chaque intervalle propre, le NCache recherche également la valeur du champ 'modifié' dans le 'ncache_db_sync'. Si la valeur trouvée est '1', le NCache supprime ensuite les clés expirées appropriées du cache et récupère toutes les lignes mises à jour de la base de données et les place dans le cache.

Notes:

  1. Il s'agit d'une dépendance basée sur les lignes. La clé de cache est associée à la valeur de clé primaire de la table. Cela signifie qu'un élément n'expire que si la ligne avec cette clé primaire est modifiée.
  2. La valeur cache_key doit être la même que celle utilisée pour ajouter l'enregistrement correspondant dans le cache.

Que faire ensuite?

© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.