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.
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é.
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.
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
);
/*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: