Sincronice el caché distribuido con la base de datos a través del sondeo

Introducción

NCache es una solución de almacenamiento en caché distribuida que ayuda a acelerar sus aplicaciones mientras reduce los costosos viajes a la base de datos. Esto, a su vez, aumenta la escalabilidad porque una gran cantidad de clientes se mueven de la base de datos a la memoria caché, lo que reduce la carga de la base de datos y elimina la necesidad de actualizar el hardware.

Cuando se agregan datos en un caché, en realidad coloca una copia de los datos originales de la base de datos en el caché. Cuando se actualiza un dato en particular en su base de datos, su copia en el caché no se ve afectada y, por lo tanto, se vuelve obsoleta. Sin embargo, esta situación ocurre solo cuando hay varias aplicaciones que actualizan los mismos datos en la base de datos pero no todas asumen la responsabilidad de actualizar los datos en el caché.

En tal situación, cuando algunas aplicaciones actualizan los datos en la base de datos pero no actualizan el caché, entonces necesita una forma de sincronizar su caché con una base de datos para que cualquier modificación a los datos en la base de datos también afecte los datos en el caché. Esto se puede lograr habilitando las notificaciones de eventos o sondeando la base de datos para buscar actualizaciones. Sin embargo, si su aplicación utiliza una de las bases de datos como SQL Server 2000, una versión anterior de Oracle u otra base de datos compatible con OLEDB que no admita notificaciones de eventos, el único método para sincronizar con ella es mediante el uso de sondeos.

Más adelante en este artículo, estudiaremos cómo NCache sincroniza la memoria caché con una base de datos mediante sondeo.

Usando DbDependency en código

Aquí hay un código de ejemplo que necesita implementar en su aplicación para sincronizar su base de datos con el caché a través del sondeo.

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();

En el código anterior, se carga una sola fila de la base de datos y se convierte en un objeto. Posteriormente, se utiliza CreateOleDbCacheDependency para establecer una conexión con la base de datos y registrar las filas para las que NCache debería buscar actualizaciones. Tenga en cuenta que cuando crea una dependencia de OleDB mediante CreateOleDbCacheDependency, debe proporcionarle la misma instrucción SQL que utilizó anteriormente en el código para obtener la fila en particular.

Una vez implementado y ejecutado el código anterior, el NCache seguirá yendo a la base de datos después de cada intervalo de limpieza especificado y buscará las filas actualizadas y luego las reemplazará con las filas caducadas correspondientes en el caché.

Configuración de la base de datos

Ya hemos visto en el código anterior cómo NCache implementa la sincronización con la base de datos. Sin embargo, el procedimiento para habilitar la sincronización basada en sondeos necesita algunos pasos más, que veremos a continuación.

  1. Crear una tabla 'ncache_db_sync' en su base de datos Oracle y agregue cuatro campos: (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) NÚMERO modificado y (4) NÚMERO de trabajo en curso.
  2. Aquí está el SQL para crear la tabla:

    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. Cree activadores de ACTUALIZACIÓN y ELIMINACIÓN para cada tabla en la que se requiera notificación. Los activadores se utilizarán para establecer el campo 'modificado' de la fila correspondiente en el ncache_db_sync tabla a 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;

Nota: cache_key debe ser la misma clave que se usa para agregar el registro correspondiente en el caché.

La forma en que los gatillos y el 'ncacheLa tabla _db_sync funciona es que cada vez que se cambia o elimina un valor en la tabla de la base de datos, se llama automáticamente al disparador apropiado. El disparador cambiará el valor del campo 'modificado' del 'ncache_db_sync' a 1, lo que indica que se ha modificado el valor de la clave principal.

El NCache realiza la limpieza de elementos caducados e innecesarios en la memoria caché después de cada período especificado. Este período se denomina intervalo limpio. En cada intervalo limpio, el NCache también busca el valor del campo 'modificado' en el 'ncachetabla _db_sync'. Si se encuentra que el valor es '1', el NCache luego elimina las claves caducadas apropiadas del caché y obtiene todas las filas actualizadas de la base de datos y los lugares en el caché.

Notas:

  1. Esta es una dependencia basada en filas. La clave de caché está asociada con el valor de clave principal de la tabla. Significa que un elemento caduca solo si se cambia la fila con esa clave principal.
  2. El valor de cache_key debe ser el mismo que se usó para agregar el registro correspondiente en el caché.

¿Qué hacer a continuación?

© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.