I meccanismi di caching in ASP.NET 2.0

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Se invece si opta per l'utilizzo diretto della classe SqlCacheDependencyAdmin, i metodi da invocare sono: EnableNotifications e EnableTableForNotifications.

Utilizzando aspnet_regsql i comandi rispettivamente sono:

aspnet_regsql -E -d database -t tabella -dt
aspnet_regsql -E -d database -d
aspnet_regsql -E -d database -lt

Utilizzando SqlCacheDependencyAdmin i metodi da invocare sono: DisableTableForNotifications, DisableNotifications, GetTablesEnabledForNotifications.

Ci sono alcuni parametri dell'eseguibile aspnet_regsql che servono per gestire la connessione al database. Il parametro -E specifica che si sta utilizzando la Windows Authentication, per passare alla SQL Server Authentication si devono sfruttare i parametri -U per l'utente e -P per la password. Se non viene specificato il nome del server, gli script vengano eseguiti sulla macchina locale. Per modificare questo comportamento bisogna inserire il parametro -S seguito dal nome del server. Infine si può utilizzare la classica stringa di connessione, al posto degli altri parametri, inserendola dopo il parametro -C.

Da notare che quanto detto vale solo per SQL Server 7/200, SQL Server 2005 è in grado di sfruttare in automatico le dipendenze, cosa che vedremo tra un attimo.

Configurazione dell'applicazione Web

Una volta settato il database, il secondo passo è configurare la nostra applicazione. Il punto in cui vanno definiti i parametri è ovviamente il web.config tramite due nuovi nodi: <connectionStrings> e <caching>. Il primo specifica le stringhe di connessione che possono essere sfruttate dall'applicazione, mentre il secondo i database che l'applicazione deve monitorare.

<connectionStrings>
  <add name="db" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|Database.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
  <caching>
    <sqlCacheDependency enabled="true">
      <databases>
        <add name="dbcache" connectionStringName="db" pollTime="15000" />
      </databases>
    </sqlCacheDependency>
  </caching>
</system.web>

Questo scorcio di configurazione mostra come impostare i parametri nel web.config. Il punto principale è il nodo caching/sqlCacheDependency/databases che contiene tutti i database verso cui fare il polling. Ogni elemento all'interno del nodo specifica un database ed dentro ogni elemento gli attributi obbligatori sono:

  • name: identifica univocamente l'elemento;
  • connectionStringName: nome di una delle connessioni specificate nel nodo connectionStrings;
  • pollTime: tempo che specifica, in millisecondi, l'intervallo del polling.
Codice

Dopo aver opportunamente configurato il sistema, possiamo finalmente passare alla stesura del codice. Ci sono tre punti in cui possiamo sfruttare l'invalidazione della cache: nell'Output Caching, nei DataSource control e nell'oggetto cache.

Per memorizzare in cache una pagina occorre utilizzare la direttiva @OutputCache presente già nella versione 1.1 del framework. La direttiva è stata arricchita con l'attributo sqlDependency che specifica la tabella del database in base alla quale la pagina in cache spira.

<%@ OutputCache SqlDependency="dbcache:tabella" Duration="60000" VaryByParam="none" >

Nell'esempio riportato sopra viene specificato che la pagina viene memorizzata fino a quando non ci sono modifiche alla tabella "tabella" nel database "dbcache" (sqlDependency) oppure per 60 secondi (Duration). Questo meccanismo di doppio controllo sulla scadenza è molto comodo in quanto permette di liberare memoria quando l'oggetto non viene utilizzato, anche se la dipendenza ancora non è cambiata. L'attributo SqlDependency è composto prima dal nome del database, così come configurato nel web.config nell'attributo name del database da monitorare, poi dal carattere di separazione (":") ed infine dal nome della tabella nel DB. Questa scadenza può essere impostata anche da codice usando la classe SqlDependency.

SqlCacheDependency dependency = new SqlCacheDependency("dbcache", "tabella")
Response.AddCacheDependency(dependency)

Con ASP.NET 2.0 sono stati introdotti i DataSource Controls, la cui trattazione esula dagli scopi di questo articolo, ed anche per questi possiamo utilizzare la dipendenza da database.

<asp:sqldatasource
  enablecaching="True"
  sqlcachedependency="dbcache:tabella"
  ...
/>

Per abilitare il caching si utilizza la proprietà EnableCaching impostata a true e la proprietà SqlCacheDependency con la solita sintassi "database:tabella". Essendo SqlCacheDependency una proprietà del controllo, la si può anche impostare da codice nel modo seguente:

dataSourceControl.SqlCacheDependency = "dbcache:tabella";

Qualunque oggetto in cache può avere una dipendenza da DB. Essendo la classe SqlCacheDependency figlia di CacheDependency, è possibile utilizzare le API già presenti nel framework dalla versione 1.x.

string var = "valore";
Cache.Insert("Var", var, new SqlCacheDependency("dbcache", "tabella"));

Il terzo argomento del metodo Insert è un oggetto di tipo CacheDependency, quindi un oggetto di tipo SqlCacheDependency è ammesso, essendo un tipo derivato.

Invalidazione basata sulle notifiche

Con l'avvento di SQL Server 2005 è stata introdotta una nuova tecnologia: SQL Server Service Broker (SSB). Questa permette lo scambio di messaggi tramite code, un pò come MSMQ, ma in maniera molto più avanzata e con molte funzionalità aggiuntive. Sfruttando questo meccanismo di messaggi, è possibile invertire il processo di controllo delle dipendenze; non è più il server a dover pollare sul DB, ma è il database a notificare al server quando il risultato di una determinata query cambia.

Quando una pagina viene messa in cache, la classe SqlCacheDependency, con l'aiuto di SqlCommand, invia al DB una richiesta di notifica per quando il set di dati rappresentati dalla query presente nell'oggetto SqlCommand cambierà. Per identificare un cambiamento nel risultato di una query, SQL Server utilizza lo stesso meccanismo usato per le Indexed-Views già presenti nella versione 2000, con il notevole miglioramento però di non duplicare fisicamente i dati di ogni query, risparmiando così molte risorse. Quando SQL Server si accorge che un resultset è cambiato, invia un messaggio all'applicazione, più precisamente a http.sys, che scatena l'invalidazione della cache.

Configurazione del database

A differenza dell'invalidazione basata su polling, non esiste un tool che permette di settare il DB da riga di comando, ma fortunatamente le operazioni da effettuare sono solamente due: l'abilitazione del Service Broker e l'abilitazione dell'utente con cui ci si connette per richiedere le notifiche. Il tutto viene fatto con due semplici query T-SQL.

ALTER DATABASE nomedb SET ENABLE_BROKER
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO utente

3 pagine in totale: <<Indietro 1 [2] 3 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC