Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Caching dipendente

Sincronizzare l'aggiornamento della cache con modifica dei dati nel database
Sincronizzare l'aggiornamento della cache con modifica dei dati nel database
Link copiato negli appunti

Nella precedente lezione abbiamo visto che cosa significa Cache del controllo Data Source ed abbiamo sviluppato un esempio, verificando il Caching per il controllo SqlDataSource. Abbiamo impostato gli attributi CacheDuration ed EnableCaching direttamente sul codice e non ci siamo per nulla preoccupati della pianificazione
della scadenza della cache
, implicitamente accettando l'impostazione predefinita CacheExpirationPolicy="Absolute".

Assegnare il valore Absolute all'attributo CacheExpirationPolicy significa che cache termina dopo il numero di secondi specificato nella CacheDuration, cominciando a contare da quando la pagina, o meglio i dati in essa contenuti, vengono caricati.

Un altro modo di pianificare la scadenza della Cache è CacheExpirationPolicy="Sliding" Il funzionamento di questa strategia di gestione della cache è quello di resettare la validità della cache non appena viene fatta una richiesta, ed è utile quando il numero di oggetti a cui applicare il caching è elevato. In questo modo, vengono mantenuti in memoria solo gli oggetti usati più di frequente.

Una politica di caching più logica è quella di invalidare la cache di database quando viene scoperto un cambiamento.

Un esempio tipico è il monitoraggio dei prezzi di un titolo azionario. Se mettiamo, ad esempio una CacheDuration di 1 minuto, se avvengono fluttuazioni di prezzo, ci verranno monitorate ogni minuto, ma se non avvengono, il prezzo non verrà aggiornato e viene meno la necessità di rileggere i dati. In questi casi è meglio che la duration della cache sia dipendente dai cambiamenti che si verificano nel database.

Avendo a disposizione SQL Server 2005 ed ASP.NET 2.0, l'implementazione della cache usando la dipendenza è piuttosto semplice.

Non occorre agire sul Web.config e non occorre preparare il database alla notifica dei cambiamenti con l'utility aspnet_regsql.exe.

L'unica cosa da fare è, oltre che stabilire una durata, abilitare l'SqlDataSource mediante l'aggiunta degli attributi:

SqlCacheDependency="CommandNotification"
EnableCaching="True"

Se però abbiamo a che fare con un database realizzato con una delle precedenti versioni di SQL Server, dobbiamo abilitare il database alla notifica dei cambiamenti. Questo può essere fatto mediante l'utility aspnet_regsql.exe, oppure mediante l'utilizzo opportuno della classe SqlCacheDependencyAdmin.

Quest'ultimo è il metodo più elegante e flessibile per risolvere il nostro problema, cerchiamo di implementarlo.

Cominciamo a realizzare la nostra applicazione. Partendo da Esplora Database, connettiamoci al file PUBS.MDF. Apriamo poi la cartella "Tabelle" e trasciniamo la tabella "authors" sulla nostra area di lavoro.

Il VWD costruisce automaticamente una GridView con il suo SqlDataSource. Nell'SqlDataSource impostiamo una cache di 30 secondi, con la dipendenza.

Listato 35. Parametri per il caching con dipendenza

CacheDuration="30000"
EnableCaching="True"
SqlCacheDependency="pubs:authors"

Mettiamo poi una label per visualizzare il tempo in ore, minuti e secondi, in cui avviene un cambiamento alla tabella di database visualizzata.

Quindi, per monitorare un cambiamento, utilizziamo l'evento Selecting del controllo SqlDataSource. L'evento Selecting viene lanciato prima che parta la query del controllo e di solito è usato per validare i parametri in gioco.

Per implementare un gestore dell'evento Selecting, clicchiamo due volte sul controllo SqlDataSource. Il VWD automaticamente passa nella parte codice e propone un gestore dell'evento vuoto, da implementare.

Scriviamo dunque il nostro gestore in cui utilizziamo la data e l'ora del server per impostare il testo della Label.

Listato 36. Delegato per l'evento Selecting del data source

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
 dateTimeLabel.Text = System.DateTime.Now.ToString();
 Cache["LastRetrieval"] = System.DateTime.Now.ToString();
}

Implementiamo ora il metodo che serve ad abilitare il database pubs alla notifica dei cambiamenti:

Listato 37. Abilitare il database alla notifica dei cambiamenti

public void EnableNotification(string tableName, string connStr)
{
 bool mustEnable = true;
 try
 {
  string[] tablesEnabled = SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connStr);
  if (tablesEnabled.Length > 0)
  {
   Response.Write("<b>Tables Enabled For Notification</b><br />");
   foreach (string table in tablesEnabled)
   {
    Response.Write(table + "<br />");
    if (table.ToString().Equals(tableName))
    {
     mustEnable = false;
    }
   }
  }
 }
 catch (Exception e)
 {
  mustEnable = true;
 }
 if (mustEnable)
 {
  SqlCacheDependencyAdmin.EnableNotifications(connStr);
  SqlCacheDependencyAdmin.EnableTableForNotifications(connStr, tableName);
  Response.Write(tableName + "<br />");
 }
}

Ricordiamoci di inserire la direttiva using System.Web.Caching; in Default.aspx.cs ed infine di richiamare il medodo in Page_Load.

Listato 38. Modifica in Page_Load

protected void Page_Load(object sender, EventArgs e)
{
  EnableNotification("authors", SqlDataSource1.ConnectionString);
}

Nel Web.config dobbiamo poi aggiungere le informazioni riguardanti la dipendenza della cache:

Listato 39. Modifiche al Web.config

...
<system.web>
...
<caching>
<sqlCacheDependency enabled="true" pollTime="30000">
<databases>
<add name="pubs" connectionStringName="PUBSConnectionString" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
...

Per testare l'applicazione possiamo usare lo stesso procedimento visto nella precedente lezione. Cioè, far partire l'applicazione, operare un cambiamento al database, editando i dati della tabella authors mediante Esplora database, e verificare che il cambiamento sui dati che visualizziamo, avviene dopo 30 secondi, in parallelo alla data e ora visualizzata.

Figura 1. Risultato finale
Risultato finale

L'esempio realizzato nel corso di questa lezione può essere scaricato da qui.

Ti consigliamo anche