Sincronizza cache con SQL / NoSQL Databases

NCache è una cache distribuita estremamente veloce e linearmente scalabile che consente di memorizzare nella cache l'applicazione per migliorare le prestazioni dell'applicazione. Quando si memorizzano nella cache i dati dell'applicazione, si crea una copia dei dati nella cache che esiste anche nel database. Se questi dati nel database cambiano, assicurati che anche la cache sia aggiornata in modo che sia sempre coerente con il database.

Per gestire questa situazione, NCache fornisce potenti funzionalità di sincronizzazione del database in cui la cache si sincronizza automaticamente quando i dati cambiano in relazione o NoSQL database. La sincronizzazione qui significa rimuovere l'elemento memorizzato nella cache corrispondente dalla cache (o ricaricarlo con Read-through). NCache fornisce quanto segue per la sincronizzazione del database:

  1. Dipendenza SQL
  2. Dipendenza Oracle
  3. Sincronizza la cache con Cosmos DB / MongoDB
  4. Dipendenza da OleDB
  5. Procedure CLR
  6. Ricarica automatica con lettura continua

Il diagramma seguente mostra l'architettura di base di come NCache supporta la sincronizzazione del database:

Sincronizzazione database

Dipendenza SQL

Dipendenza Sql è usato da NCache nel caso in cui il tuo database sia SQL Server. Puoi specificare una SqlDependency per qualsiasi elemento memorizzato nella cache quando lo aggiungi o lo aggiorni nella cache. SQL Server monitora il set di dati per eventuali aggiunte, aggiornamenti o rimozioni e invia notifiche NCache tramite le notifiche SQL quasi immediatamente dopo l'aggiornamento del database. Si tratta di notifiche di database che vengono trasformate in eventi .NET.

SqlDependency può essere uno dei seguenti:

  • Query SQL parametrizzata
  • Procedura memorizzata

Puoi trovare maggiori dettagli su questo argomento nel blog Sincronizza la cache con SQL Server.

Utilizzo della query parametrizzata

Ecco come utilizzare SqlDependency nel codice .NET con query parametriche dinamiche:

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

Utilizzo delle stored procedure

Ecco come puoi usare SqlDependency nel tuo codice .NET con le stored procedure:

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

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

Dipendenza da Oracle

Dipendenza Oracle è usato da NCache nel caso in cui il tuo database sia Oracle 10g o successivo e sia in esecuzione su Windows o Unix. Proprio come SqlDependency, puoi specificare OracleDependency per qualsiasi elemento memorizzato nella cache quando lo aggiungi o lo aggiorni nella cache.

OracleDependency può essere uno dei seguenti:

  • Query SQL parametrizzata
  • Procedura memorizzata

Oracle Server monitora quindi questo set di dati per eventuali aggiunte, aggiornamenti o rimozioni e quando ciò accade, notifica NCache tramite Oracle Notifications quasi immediatamente dopo l'aggiornamento del database. Queste notifiche utilizzano la comunicazione client/server di Oracle sottostante e parlano con NCache tramite .NET.

Utilizzo di query parametrizzate

Ecco come utilizzare OracleDependency nel codice .NET con query parametriche dinamiche:

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

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

Utilizzo delle stored procedure

È possibile utilizzare chiamate di stored procedure con parametri nella dipendenza Oracle come mostrato di seguito:

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

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

Sincronizza la cache con Cosmos DB / MongoDB

NCache fornisce inoltre maggiore flessibilità e controllo su come e quando invocare una dipendenza da un elemento della cache. Dipendenza estensibile dalle notifiche ti consente di implementare la tua logica personalizzata che specifica quando rimuovere i dati dalla cache. Puoi scrivere il tuo provider personalizzato per il tuo database sottostante come Cosmos DB e MongoDB e questo provider viene distribuito nella cache. La cache quindi controlla tutte le dipendenze distribuite se devono essere rimosse o meno.

Puoi creare il tuo provider personalizzato e distribuirlo nella cache per utilizzare la dipendenza personalizzata nella tua applicazione. Il frammento di codice seguente mostra come utilizzare un provider personalizzato distribuito per la sincronizzazione di Cosmos DB nel codice .NET durante l'aggiunta di elementi alla cache:

Customer customer = LoadCustomerFromDB(customerId);

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

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

Dipendenza da OleDB

Dipendenza da OleDB La dipendenza da OleDB è utilizzata da NCache nel caso in cui il tuo database non sia né SQL Server né Oracle ma sia un database compatibile con OLEDB. Puoi anche utilizzare DbDependency con SQL Server e Oracle se non vuoi che le loro notifiche di eventi possano diventare loquaci nel caso in cui i tuoi dati cambino molto rapidamente.

In DbDependency, crei una tabella chiamata ncache_db_sync nel database che contiene una riga per ogni elemento memorizzato nella cache con DbDependency. Modificare i trigger del database per aggiornare le righe in questa tabella quando i dati corrispondenti nel database cambiano. NCache interroga questa tabella per le righe aggiornate, quindi in un sondaggio, NCache recupera migliaia di righe e le sincronizza con il database.

Ecco come puoi usare DbDependency nel tuo codice .NET.

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

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

Procedure CLR

Quando hai un numero molto elevato di elementi nella cache e tutti devono essere sincronizzati con il database, è molto meglio scrivere un Procedura CLR in SQL Server su Windows. Questa procedura CLR viene richiamata dai trigger del database quando i dati rilevanti cambiano. Questa procedura CLR rende quindi asincrona NCache Chiamate API per aggiungere, aggiornare o rimuovere l'elemento memorizzato nella cache corrispondente dalla cache.

Ecco un esempio di una procedura CLR che rimuove l'oggetto se viene aggiornato.

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

Ricarica automatica con gestore read-through

Il comportamento predefinito della sincronizzazione del database consiste nel rimuovere l'elemento memorizzato nella cache dal database quando i dati corrispondenti nel database vengono modificati. Tuttavia, ci sono situazioni in cui vuoi semplicemente aggiornarlo con l'ultima versione dei dati.

Per gestire questa esigenza, NCache consente di combinare la sincronizzazione del database con il Leggi tutto caratteristica del gestore di NCache. Con questo, NCache chiama semplicemente il gestore Read-through per ricaricare la copia più recente dell'elemento memorizzato nella cache e quindi aggiorna la cache con essa. Questa funzione offre la flessibilità per la sincronizzazione NCache con qualsiasi relazione o NoSQL database che è stato configurato includendo quanto segue (e altro):

  1. SQL Server
  2. Oracle
  3. Cosmo DB
  4. MongoDB

Il frammento di codice seguente mostra come i dati possono essere ricaricati automaticamente in blocco NCache da Cosmos DB tramite Read-Through. Puoi anche trovare maggiori dettagli nel blog Sincronizza la cache con CosmosDB.

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

Cosa fare dopo?

NCache Dettagli
Scarica la chiave di installazione gratuita di 30 giorni
Richiedi una Demo LIVE personalizzata
Leggi la documentazione del prodotto
© Copyright Alachisoft 2002 - . Tutti i diritti riservati. NCache è un marchio registrato di Diyatech Corp.