Sincronizar la caché con bases de datos SQL/NoSQL

NCache Proporciona consistencia de datos en tiempo real al sincronizar automáticamente su caché distribuida con bases de datos SQL Server, Oracle y NoSQL. Esto garantiza que su aplicación siempre sirva datos actualizados con un rendimiento inferior al milisegundo, eliminando los datos obsoletos mediante notificaciones basadas en eventos y sondeo.

NCache Es una caché distribuida extremadamente rápida y linealmente escalable que permite almacenar en caché los datos de la aplicación para mejorar su rendimiento. Al almacenar en caché los datos de la aplicación, se crea una copia de los datos en la caché que también existe en la base de datos. Si estos datos cambian en la base de datos, es importante asegurarse de que la 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 donde la caché se sincroniza automáticamente cuando los datos cambian en una base de datos relacional o NoSQL. La sincronización aquí significa eliminar el elemento en caché correspondiente de la caché (o recargarlo con Leer de parte a parte). NCache proporciona lo siguiente para la sincronización de la base de datos:

  1. Dependencia SQL
  2. OracleDependencyOracleDependency
  3. Sincronizar caché con 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:

NCache Arquitectura de sincronización de bases de datos: sincronización de caché distribuida (Windows/Linux) con SQL Server, Oracle, Cosmos DB y MongoDB mediante notificaciones de eventos en tiempo real.
NCache Arquitectura de sincronización de bases de datos en tiempo real para RDBMS y NoSQL.

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 Mediante notificaciones SQL casi inmediatamente después de una actualización de la base de datos. Estas notificaciones se transforman en eventos .NET.

SqlDependency puede ser cualquiera de los siguientes:

  • Consultas en línea
  • Procedimientos almacenados

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

Cómo funciona la dependencia de SQL

  • Trigger: SQL Server detecta un cambio de datos (Insertar, Actualizar o Eliminar).
  • Notificar: SQL Server envía una notificación de evento .NET a NCache.
  • Acción: NCache invalida o recarga automáticamente el elemento para mantener la integridad.

Uso de consultas en línea

A continuación se explica cómo crear una dependencia SQL mediante una consulta SQL construida dinámicamente:

// Precondition: Cache is already connected
// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
    string productKey = $"Product: {product.ProductID}";

    // Creating an SQL dependency on the UnitPrice of product. Whenever the UnitPrice changes, the product is removed from the cache
    string query = $"SELECT UnitPrice FROM dbo.Products WHERE ProductID = {product.ProductID}";

    // Creating dependency
    SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query);

    CacheItem productItem = new CacheItem(product);

    // Adding Dependency to product item
    productItem.Dependency = dependency;

    // Adding CacheItem in cache
    _cache.Add(productKey, productItem);
}

Usar procedimientos almacenados

A continuación se explica cómo puede utilizar la dependencia SQL en su código .NET con procedimientos almacenados:

// Precondition: Cache is already connected

// Creating connection string to get connected with the database
string connectionString = "your_connection_string_here";
string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";

// Getting products from the database
List<Product> products = FetchProductFromDB();

// Creating dictionary of CacheItems
Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>();

foreach (Product product in products)
{
    string productKey = $"Product: {product.ProductID}";

    // Creating Param to be passed in stored procedure dictionary
    SqlCmdParams paramProductID = new SqlCmdParams
    {
        Type = CmdParamsType.Int,
        Value = product.ProductID
    };

    // Creating stored procedure params
    Dictionary<string, SqlCmdParams> parameters = new Dictionary<string, SqlCmdParams>();
    parameters.Add("@ProductID", paramProductID);

    CacheItem productItem = new CacheItem(product);

    // Creating an SQL dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
    SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters);

    // Adding Dependency to product item
    productItem.Dependency = dependency;

    cacheItems.Add(productKey, productItem);
}
// Adding CacheItems in cache
_cache.AddBulk(cacheItems);

Dependencia de Oracle

NCache Utiliza la Notificación Continua de Consultas (CQN) de Oracle para supervisar los cambios en la base de datos. A diferencia del sondeo tradicional, este mecanismo basado en push garantiza que el servidor Oracle solo se comunique con NCache Cuando se modifica el conjunto de datos específico definido por la consulta SQL. Esto reduce significativamente la sobrecarga de la red y garantiza la sincronización de la caché en tiempo real.

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:

  • Consultas en línea
  • Procedimiento almacenado

Luego, Oracle Server supervisa este conjunto de datos para detectar cualquier adición, actualización o eliminación 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.

Uso de consultas en línea

A continuación se explica cómo puede utilizar la dependencia de Oracle en su código .NET mediante consultas en línea:

// Precondition: Cache is already connected

// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
      string productKey = $"Product: {product.ProductID}";

      // Creating an Oracle dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
      string query = $"SELECT ROWID, UnitPrice FROM Products WHERE ProductID = {product.ProductID}";

      OracleCacheDependency dependency = new OracleCacheDependency(connectionString, query);

      CacheItem productItem = new CacheItem(product);

      // Adding Dependency to product item
      productItem.Dependency = dependency;

      // Adding CacheItem in cache
      cache.Add(productKey, productItem);
}

Usar procedimientos almacenados

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

// Precondition: Cache is already connected

// Creating a connection string to get connected with the database
string connectionString = "your_connection_string_here";

string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID";

// Getting products from the database
List<Product> products = FetchProductFromDB();

foreach (Product product in products)
{
      string productKey = $"Product: {product.ProductID}";
      // Creating Param to be passed in stored procedure dictionary
      OracleCmdParams paramProductID = new OracleCmdParams
      {
            Type = OracleCmdParamsType.Int32,
            Value = product.ProductID
      };
      // Creating stored procedure params
      Dictionary<string, OracleCmdParams> parameters = new Dictionary<string, OracleCmdParams>();
      parameters.Add("@ProductID", paramProductID);

      CacheItem productItem = new CacheItem(product);

      // Creating an Oracle dependency on the UnitPrice of the product. Whenever the UnitPrice changes, the product is removed from the cache
      OracleCacheDependency dependency = new OracleCacheDependency(connectionString, spGetUnitPriceByProductID, OracleCommandType.StoredProcedure, parameters);

      // Adding Dependency to product item
      productItem.Dependency = dependency;

      // Adding CacheItem in cache
      cache.Add(productKey, productItem);
}

Sincronizar caché con MongoDB

NCache Ofrece flexibilidad y control sobre la invalidación de caché mediante dependencias de notificación personalizadas. En MongoDB, puede sincronizar su caché en tiempo real con su base de datos MongoDB mediante flujos de cambios.

Esto detecta inserciones, actualizaciones, eliminaciones y reemplazos en sus colecciones de MongoDB. NCache puede eliminar o actualizar inmediatamente las entradas de caché correspondientes cuando ocurre un cambio, lo que garantiza que su caché permanezca actualizado y consistente con la base de datos.

A continuación se muestra un ejemplo de cómo implementar esta sincronización utilizando los flujos de cambios de MongoDB en su aplicación .NET:

var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Customer>>()
    .Match("{ operationType: { $in: ['insert', 'update', 'replace', 'delete'] } }");
 
var cursor = collection.Watch(pipeline);
await cursor.ForEachAsync(change =>
{
    string cacheKey = $"Customer:CustomerID:{change.FullDocument.Id}";
    cache.Remove(cacheKey);
});

Dependencia OleDB

Dependencia OleDB es utilizado por NCache Si su base de datos no es SQL Server ni Oracle, sino compatible con OLEDB, también puede usar DbDependency con SQL Server y Oracle si no desea recibir sus notificaciones de eventos, que podrían resultar confusas si sus datos cambian rápidamente.

En DbDependency, se crea una tabla llamada ncache_db_sync en la base de datos, que contiene una fila por cada elemento almacenado en caché con DbDependency. Se modifican los disparadores de la base de datos para actualizar las filas de esta tabla cuando cambian los datos correspondientes. 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)
    {

        // Connect to the cache
        ICache cache = CacheManager.GetCache(cacheName);

        // Remove specified item
        cache.Remove(key);

        // Dispose the cache
        cache.Dispose();
    }

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é cuando los datos correspondientes cambian. Sin embargo, en ocasiones simplemente se 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 función de almacenamiento en caché 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 base de datos relacional o NoSQL que haya sido configurada, incluyendo las siguientes (y más):

  1. SQL Server
  2. el
  3. MongoDB

El siguiente fragmento de código muestra cómo se pueden recargar automáticamente los datos de forma masiva en NCache de la base de datos mediante lectura directa. También puede encontrar más detalles. aquí.

String[] keys = { "Product:1001", "Product:1002",
"Product:1003","Product:1004"};

// Specify the readThruOptions for Read-through operations
var readThruOptions = new ReadThruOptions();
readThruOptions.Mode = ReadMode.ReadThru;

// Retrieve the dictionary of Products with corresponding products
IDictionary<string, Product> retrievedItems = cache.GetBulk<Product>(keys, readThruOptions);

Entornos compatibles para la sincronización

  • Relacional: SQL Server, Oracle, PostgreSQL, MySQL (a través de OLEDB/CLR).
  • No SQL: MongoDB, Azure Cosmos DB.
  • Personalizada: Cualquier fuente de datos a través de los controladores CustomDependency y Read-Through.

Cómo elegir el mecanismo de sincronización adecuado

Escenario Mecanismo recomendado NCache Característica utilizada
Actualizaciones estándar de SQL/Oracle Notificaciones de base de datos Dependencia Sql / OracleDependencyOracleDependency
Actualizaciones masivas/en masa Procedimientos CLR Procedimientos almacenados CLR (asincrónicos)
Bases de datos genéricas/heredadas Polling Dependencia de base de datos (vía OLEDB)
Arquitecturas NoSQL Flujos de cambio Sincronización de MongoDB mediante dependencia personalizada

¿Qué hacer a continuación?

Preguntas frecuentes

NCache Utiliza un modelo de sincronización basado en notificaciones. Aprovechando funciones como Dependencia Sql y OracleDependencyOracleDependencyLa base de datos envía una señal en tiempo real a la caché en el momento en que se actualiza o elimina un registro. Esto permite NCache para invalidar o recargar instantáneamente el elemento obsoleto.

Sí. Para bases de datos sin soporte de notificación nativa, NCache Proporciona dependencia basada en sondeo (DbDependency). NCache Comprueba periódicamente una tabla de sincronización en su base de datos para detectar cambios, lo que la hace compatible con cualquier fuente compatible con OLEDB.

Para entornos con volúmenes de actualización masivos, se recomienda utilizar procedimientos almacenados CLR. Estos procedimientos se ejecutan directamente en SQL Server y realizan llamadas asincrónicas a NCache, evitando la sobrecarga de miles de notificaciones de eventos .NET individuales.

Absolutamente. NCache Se sincroniza con MongoDB mediante Change Streams para detectar actualizaciones de colecciones en tiempo real. Para otras fuentes NoSQL, puede utilizar NCacheProveedor de lectura simultánea de 's para recargar automáticamente los datos en caso de vencimiento o invalidez.

NCache Está diseñado para alta disponibilidad. Si se interrumpe la conexión a la base de datos, NCache se puede configurar para volver a intentar la sincronización o confiar en las configuraciones TTL (tiempo de vida) como respaldo para garantizar que los datos obsoletos no persistan indefinidamente.

Contáctenos

TELÉFONO

+1 214-619-2601 (EE.UU.)

+44 20 7993 8327 (Reino Unido)

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