SQL Server 2005 e SQL Server 2008 usano una soluzione di notifica molto simile fra loro e integrata nel database con un sistema di messaggistica chiamato Service Broker.
Service Broker si occupa di gestire la coda dei messaggi di notifica di un database.
.NET offre un modello integrato con ADO.NET in modo tale da istruire SQL Server per mandare una notifica per qualsiasi operazione che modifica il risultato di una query da noi registrata.
ASP.NET offre un modello che si integra perfettamente con il precedente e ci permette di invalidare gli oggetti in cache automaticamente.
Per questo esempio, creiamo un nuovo database (TestDB) con una tabella (Contact).
Adesso apriamo il prompt di DOS e digitiamo:
cd %windir%\Microsoft.NET\Framework\v2.0.50727
Quì abbiamo la possibilità di lanciare il seguente comando:
aspnet_regsql.exe -E -ed -d TestDB -et -t Contact
Il quale, specificando il database e la tabella nella quale vogliamo abilitare la notifica, modificherà il nostro database così:
Adesso che il database è pronto, dobbiamo abilitare ASP.NET affinchè si occupi di fare il polling sul database.
Creiamo un nuovo progetto e aggiungiamo una label, con ID Label1, nella pagina Default.aspx. Nel codice della pagina, nel nel metodo Page_Load, inseriamo:
Label1.Text = System.DateTime.Now.ToString();
Apriamo il Server Explorer di Visual Studio 2008, create una nuova connessione (TestDBConnectionString) per il database e la tabella appena configurati e tranisciamo la tabella Contact all'interno della pagina Default.aspx.
Testando il progetto si nota che il timestamp della label cambia ad ogni refresh.
Ritorniamo al makup language della pagina Default.aspx e inseriamo la direttiva:
<%@ OutputCache Duration="3600" SqlDependency="TestDB:Contact" VaryByParam="none" %>
A differenza degli altri casi, quì specifichiamo SqlDependecy, specificando il database e la tabella interessate.
Il nome del database viene specificato nel web.config. Per questo dovremo modificare il web.config come segue:
<system.web>
<caching>
<sqlCacheDependency enabled = "true" pollTime = "1000">
<databases>
<add name="TestDB" connectionStringName="TestDBConnectionString" pollTime = "1000" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
Il pollTime specifica il numero di millisecondi tra un controllo e l'altro (il valore minimo è 500ms).
Bisogna anche specificare la ConnectionStringName utilizzata.
Lanciate il progetto, provate ad aggiornare un paio di volte la pagina.
Come potete vedere, il timestamp nella label non verrà aggiornato.
Aprire il Server Explorer, selezionate la tabella Contact con il tasto destro e cliccate sulla voce Open Table Definition e provate a modificare i valori all'interno della tabella.
Provate a aggiornare la pagina su IE e i dati al suo interno verranno aggiornati.
Riprovate ad aggiornare la pagina e la pagina non verrà aggiornata.
Ci sono un paio di regole fondamentali da seguire quando si crea una query per Service Broker, un elenco completo potete trovarlo su SQL Server Books Online:
- Le query devono essere del tipo:
[Owner].table ad esempio dbo.Contact
- Non si possono usare metodi quali:
- Bisogna specificare ogni singola colonna che ci interessa.