Sincronizar caché con SQL / NoSQL Databases

NCache es un caché distribuido extremadamente rápido y linealmente escalable que le permite a la aplicación de caché mejorar el rendimiento de su aplicación. Cuando almacena en caché los datos de la aplicación, está creando una copia de los datos en el caché que también existe en su base de datos. Si estos datos en la base de datos cambian, querrá asegurarse de que la memoria caché también se actualice para que siempre sea coherente con la base de datos.

Para manejar esta situación, NCache proporciona potentes funciones de sincronización de bases de datos en las que la memoria caché se sincroniza cuando los datos cambian de forma relacional o NoSQL database. Sincronización aquí significa eliminar el elemento almacenado en caché correspondiente del caché (o volver a cargarlo con Lectura completa). NCache proporciona lo siguiente para la sincronización de la base de datos:

  1. Dependencia SQL
  2. OracleDependencyOracleDependency
  3. Sincronizar caché con Cosmos DB / MongoDB
  4. Dependencia OleDB
  5. Procedimientos CLR
  6. Recarga automática con lectura completa

El siguiente diagrama muestra la arquitectura básica de cómo NCache admite la sincronización de la base de datos:

Sincronización de base de datos

Dependencia SQL

Dependencia Sql es utilizado por NCache en caso de que su base de datos sea SQL Server. Puede especificar una SqlDependency para cualquier elemento en caché cuando lo agregue o actualice en el caché. SQL Server supervisa el conjunto de datos en busca de adiciones, actualizaciones o eliminaciones y notifica NCache a través de notificaciones SQL casi inmediatamente después de la actualización de la base de datos. Estas son notificaciones de bases de datos que se transforman en eventos .NET.

SqlDependency puede ser cualquiera de los siguientes:

  • Consulta SQL parametrizada
  • Procedimiento almacenado

Puedes encontrar más detalles sobre este tema en el blog Sincronizar caché con SQL Server.

Uso de consulta parametrizada

Así es como puede usar SqlDependency en su código .NET con consultas parametrizadas dinámicas:

string connString = ConfigurationManager.AppSettings["connectionString"];
string query = "SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID > @productID";
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("@productID", param);

SqlCacheDependency sqlDepenency = new SqlCacheDependency(connString, query, SqlCommandType.Text, sqlCmdParam);

Usar procedimientos almacenados

Así es como puede usar SqlDependency en su código .NET con procedimientos almacenados:

...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("productID", param);

SqlCacheDependency sqlDependency = new SqlCacheDependency(connString, "sp_GetProductByID", SqlCommandType.StoredProcedure, sqlCmdParams);

Dependencia de Oracle

OracleDependencyOracleDependency es utilizado por NCache en caso de que su base de datos sea Oracle 10g o posterior y se ejecute en Windows o Unix. Al igual que SqlDependency, puede especificar OracleDependency para cualquier elemento en caché cuando lo agregue o actualice en el caché.

OracleDependency puede ser cualquiera de los siguientes:

  • Consulta SQL parametrizada
  • Procedimiento almacenado

Luego, Oracle Server monitorea este conjunto de datos en busca de adiciones, actualizaciones o eliminaciones y, cuando eso sucede, notifica NCache a través de Oracle Notifications casi inmediatamente después de la actualización de la base de datos. Estas notificaciones utilizan la comunicación cliente/servidor de Oracle debajo y se comunican con NCache a través de .NET.

Uso de consultas parametrizadas

Así es como puede usar OracleDependency en su código .NET con consultas parametrizadas dinámicas:

...
var param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDepenency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam);

Usar procedimientos almacenados

Puede usar llamadas de procedimientos almacenados parametrizados en la dependencia de Oracle como se muestra aquí:

...
OracleCmdParams param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDependency = new OracleCacheDependency(connString, "sp_GetProductByID", OracleCommandType.StoredProcedure, oracleParam);

Sincronizar caché con Cosmos DB / MongoDB

NCache también proporciona más flexibilidad y control sobre cómo y cuándo invocar una dependencia en un elemento de caché. Dependencia de notificación extensible le permite implementar su lógica personalizada que especifica cuándo eliminar datos del caché. Puede escribir su proveedor personalizado para su base de datos subyacente, como Cosmos DB y MongoDB, y este proveedor se implementa en la memoria caché. Luego, la memoria caché verifica todas las dependencias implementadas, ya sea que deban eliminarse o no.

Puede crear su proveedor personalizado e implementarlo en el caché para usar la dependencia personalizada en su aplicación. El siguiente fragmento de código muestra cómo se puede usar un proveedor personalizado implementado para la sincronización de Cosmos DB en su código .NET mientras agrega elementos a la memoria caché:

Customer customer = LoadCustomerFromDB(customerId);

CacheDependency cosmosDbDependency = new CosmosDbNotificationDependency<Customer>(. . .) ;

var cacheItem = new CacheItem(customer);
cacheItem.Dependency = cosmosDbDependency;
cache.Insert("Customer:" + customer.Id, cacheItem);

Dependencia OleDB

Dependencia OleDB La dependencia OleDB es utilizada por NCache en caso de que su base de datos no sea SQL Server ni Oracle, pero sea una base de datos compatible con OLEDB. También puede usar DbDependency con SQL Server y Oracle si no desea que sus notificaciones de eventos puedan volverse conversadoras en caso de que sus datos cambien muy rápidamente.

En DbDependency, crea una tabla llamada ncache_db_sync en la base de datos que contiene una fila para cada elemento almacenado en caché con DbDependency. Usted modifica los disparadores de su base de datos para actualizar filas en esta tabla cuando los datos correspondientes en la base de datos cambian. NCache sondea esta tabla en busca de filas actualizadas, por lo que en una encuesta, NCache recupera miles de filas y las sincroniza con la base de datos.

Así es como puede usar DbDependency en su código .NET.

DBCacheDependency oledbDependency = DBDependencyFactory.CreateOleDbCacheDependency(connectionString, "PrimaryKey:dbo.Products");

var cacheItem = new CacheItem(product);
cacheItem.Dependency = oledbDependency;
cache.Insert(key, cacheItem);

Procedimientos CLR

Cuando tiene una gran cantidad de elementos en el caché y todos deben sincronizarse con la base de datos, es mucho mejor escribir un Procedimiento CLR en SQL Server en Windows. Este procedimiento CLR se llama desde los disparadores de su base de datos cuando cambian los datos relevantes. Este procedimiento CLR luego hace asíncrono NCache Llamadas a la API para agregar, actualizar o eliminar el elemento almacenado en caché correspondiente de la memoria caché.

Aquí hay un ejemplo de un procedimiento CLR que elimina el objeto si se actualiza.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void RemoveOnUpdate(string cacheName, string key)
{            
    cacheName = "demoClusteredCache";
    Cache cache = CacheManager.GetCache(cacheName);
    cache.RemoveAsync(key);
}

Recarga automática con controlador de lectura

El comportamiento predeterminado de la sincronización de la base de datos es eliminar el elemento almacenado en caché de la base de datos cuando cambian los datos correspondientes en la base de datos. Sin embargo, hay situaciones en las que simplemente desea actualizarlo con la última versión de los datos.

Para manejar esta necesidad, NCache le permite combinar la sincronización de la base de datos con la Leer de parte a parte característica del controlador de NCache. Con este, NCache simplemente llama al controlador de lectura completa para recargar la última copia del elemento en caché y luego actualiza el caché con él. Esta característica proporciona la flexibilidad para sincronizar NCache con cualquier relación o NoSQL database que ha sido configurado incluyendo lo siguiente (y más):

  1. SQL Server
  2. Oracle
  3. base de datos cosmos
  4. MongoDB

El siguiente fragmento de código muestra cómo se pueden recargar automáticamente los datos de forma masiva en NCache de Cosmos DB mediante Read-Through. También puedes encontrar más detalles en el blog. Sincronizar caché con CosmosDB.

public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList docs, CancellationToken cancellationToken) 
{
    cacheItems = cache.GetBulk(DocsKeys, new ReadThruOptions {Mode = ReadMode.ReadThruForced} );
    return Task.CompletedTask;
}

¿Qué hacer a continuación?

NCache Detalles
Descargar clave de instalación gratuita de 30 días
Solicite una demostración EN VIVO personalizada
Leer la documentación del producto
© Copyright Alachisoft 2002 - Todos los derechos reservados. NCache es una marca registrada de Diyatech Corp.