Sincronizza la cache distribuita con il database tramite il polling

Introduzione

NCache è una soluzione di memorizzazione nella cache distribuita che aiuta a velocizzare le applicazioni riducendo al contempo costosi viaggi al database. Questo a sua volta aumenta la scalabilità perché un gran numero di client viene spostato dal database alla cache, con conseguente minor carico sul database ed eliminando la necessità di aggiornare l'hardware.

Quando i dati vengono aggiunti in una cache, si inserisce effettivamente una copia dei dati originali dal database nella cache. Quando un dato particolare nel database viene aggiornato, la sua copia nella cache rimane inalterata e quindi diventa obsoleta. Tuttavia, questa situazione si verifica solo quando sono presenti più applicazioni che aggiornano gli stessi dati nel database ma non tutte si assumono la responsabilità di aggiornare i dati nella cache.

In una situazione del genere, quando alcune applicazioni aggiornano i dati nel database ma non aggiornano la cache, è necessario un modo per sincronizzare la cache con un database in modo che qualsiasi modifica ai dati nel database influisca anche sui dati nella cache. Ciò può essere ottenuto abilitando le notifiche di eventi o eseguendo il polling del database per cercare aggiornamenti. Tuttavia, se l'applicazione utilizza uno dei database come SQL Server 2000, una versione precedente di Oracle o un altro database compatibile con OLEDB che non supporta le notifiche di eventi, l'unico metodo per sincronizzarsi con esso è l'utilizzo del polling.

Più avanti in questo articolo, studieremo come NCache sincronizza la cache con un database utilizzando il polling.

Utilizzo di DbDependency nel codice

Ecco un codice di esempio che devi implementare nella tua applicazione per sincronizzare il tuo database con la cache tramite il polling.

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

Nel codice precedente, una singola riga del database viene caricata e convertita in un oggetto. Successivamente, CreateOleDbCacheDependency viene utilizzato per stabilire una connessione con il database e registrare le righe per le quali NCache dovrebbe cercare gli aggiornamenti. Nota che quando crei una dipendenza OleDB usando CreateOleDbCacheDependency, devi fornirla con la stessa istruzione SQL che hai usato in precedenza nel codice per recuperare la riga particolare.

Una volta che il codice sopra è stato implementato ed eseguito, il NCache continuerà ad andare al database dopo ogni intervallo di pulizia specificato e recupererà tutte le righe aggiornate e quindi le sostituirà con le corrispondenti righe scadute nella cache.

Configurazione del database

Abbiamo già visto nel codice sopra come NCache implementa la sincronizzazione con il database. Tuttavia, la procedura per abilitare la sincronizzazione basata sul polling necessita di alcuni passaggi in più, che vedremo di seguito.

  1. Crea una tabella 'ncache_db_sync' nel database Oracle e aggiungi quattro campi: (1) cache_key VARCHAR2, (2) cache_id VARCHAR2, (3) NUMBER modificato e (4) work_in_progress NUMBER.
  2. Ecco l'SQL per creare la tabella:

    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. Crea trigger UPDATE ed DELETE per ogni tabella su cui è richiesta la notifica. I trigger verranno utilizzati per impostare il campo 'modificato' della riga corrispondente nel file ncache_db_sync tabella 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 deve essere la stessa chiave utilizzata per aggiungere il record corrispondente nella cache.

Il modo in cui i trigger e il 'ncacheLa tabella _db_sync' funziona è che ogni volta che un valore nella tabella del database viene modificato o eliminato, il trigger appropriato viene automaticamente chiamato. Il trigger cambierà il valore del campo 'modificato' del 'ncache_db_sync' su 1, a indicare che il valore della chiave primaria è stato modificato.

I NCache esegue la pulizia degli elementi scaduti e non necessari nella cache dopo ogni periodo specificato. Questo periodo è chiamato intervallo pulito. Ad ogni intervallo pulito, il NCache cerca anche il valore del campo 'modificato' nel 'ncachetabella _db_sync'. Se il valore risulta essere '1', il NCache quindi rimuove le chiavi scadute appropriate dalla cache e recupera tutte le righe aggiornate dal database e le posizioni nella cache.

Note:

  1. Questa è una dipendenza basata su righe. La chiave della cache è associata al valore della chiave primaria della tabella. Significa che un elemento scade solo se la riga con quella chiave primaria viene modificata.
  2. Il valore cache_key deve essere lo stesso utilizzato per aggiungere il record corrispondente nella cache.

Cosa fare dopo?

© Copyright Alachisoft 2002 - . Tutti i diritti riservati. NCache è un marchio registrato di Diyatech Corp.