In un sito con pagine che effettuano varie operazioni ogni volta che vengono caricate, soprattutto operazioni di accesso ai dati su di un database, è molto utile applicare un certo tipo di politiche di caching dei dati, in modo tale da aumentare le prestazioni di ogni pagina del sito.
Il .NET Framework ci permette di accedere alla cache di ogni pagina tramite l'oggetto Cache del namespace System.Web.Caching; questo oggetto può essere sfruttato come contenitore dei dati che vengono richiesti dalla pagina per un certo periodo di tempo.
Vediamo un esempio di utilizzo della cache di una pagina per salvare i risultati di una query ed evitare (per un periodo di tempo ben preciso) che la base di dati sia accessa ad ogni richiesta della pagina.

C#

protected System.Web.UI.WebControls.Repeater rep;

private OleDbConnection conn = null;
private OleDbCommand cmd = null;

public void Page_Load(object sender, EventArgs e)
{
DataTable dt = (DataTable)this.Cache.Get("LinksDataTable");
if(dt == null)
{
//Se quell'oggetto non è presente in cache //faccio la richiesta al database using(conn = new OleDbConnection("stringa di connessione ...");
{
using(cmd = new OleDbCommand("SELECT * FROM Links", conn);
{
OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "Links");
dt = ds.Tables["Links"];
//Aggiungo la DataTable creata alla cache della pagina this.Cache.Insert("LinksDataTable", dt);

this.rep.DataSource = dt;
this.rep.DataBind();
}
}
}
else
{
//Se quell'oggetto è presente il cache //stampo i dati this.rep.DataSource = dt;
this.rep.DataBind();
}
}

VB.NET
Protected WithEvents rep As System.Web.UI.WebControls.Repeater

Private conn As OleDbConnection
Private cmd As OleDbCommand

Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

Dim dt As DataTable = CType(this.Cache.Get("LinksDataTable"), DataTable);
If dt Is Nothing

'Se quell'oggetto non è presente in cache 'faccio la richiesta al database Dim conn As New OleDbConnection("stringa di connessione ...")
Dim cmd As New OleDbCommand("SELECT * FROM Links", conn)
Dim adapter As New OleDbDataAdapter(cmd)
Dim ds As New DataSet()
adapter.Fill(ds, "Links")
dt = ds.Tables("Links")
'Aggiungo la DataTable creata alla cache della pagina Me.Cache.Insert("LinksDataTable", dt);

Me.rep.DataSource = dt;
Me.rep.DataBind();

Else
'Se quell'oggetto è presente il cache stampo i dati Me.rep.DataSource = dt
Me.rep.DataBind()
End If

End Sub

La durata della cache di ogni pagina può essere definita in due modi, o tramite la direttiva @OutputCache da inserire subito dopo la direttiva @Page della pagina in questione

<%@ OutputCache Duration="60" VaryByParam="*" %>

oppure tramite l'aggiunta di una nuova sezione nel file web.config dell'applicazione web

<configuration>

<configSections>
<section name="CacheSettings"
type="System.Configuration.NameValueFileSectionHandler, System,
Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

/>
</configSections>
<CacheSettings>
<add key="EnableCaching" value="true" />
<add key="RequireKeyDefinitionInConfig" value="true" />
<add key="DefaultCacheDurationUnits" value="seconds" />
<add key="DefaultCacheDurationValue" value="60" />
</CacheSettings>
</configuration>

che ci permette di specificare parametri per la cache di tutte le pagine del sito, oppure anche per ogni singolo oggetto che pensiamo di inserirci.
Io ho utilizzato questa tecnica in molte delle pagine e dei server control presenti in questo sito e devo dire che le prestazioni delle richieste di ogni pagina sono davvero migliorate.