Monday, October 5, 2009

Caching - Data Source Controls

SqlDataSource, ObjectDataSource e XmlDataSource supportano nativamente il caching.
Usare il caching con questi controlli è altamente consigliato, perchè ad ogni postback la sorgente dati viene richiesta.
In più i dati vengono richiesti per ogni controllo in bound, quindi se avremo 3 controlli in bound, ad ogni refresh, partiranno 3 query.

In questo caso mettendo in cache questi dati si ridurranno drasticamente i tempi di caricamento.
Questi controlli offrono un insieme di proprietà utili per attivare comodamente la cache:
  • EnableCaching: true per attivare il caching.
  • CacheExpirationPolicy: può essere di due tipi Absolute o Sliding (guardare i post precedenti per capire cosa si intende)
  • CacheDuration: Se la CacheExpirationPolicy è settata su Absolute, il controllo memorizzerà i dati in cache alla prima operazione e li mantiene in memoria per il periodo di tempo specificato, quindi viene cancellata e aggiornata all'operazione successiva.
    Se invece è impostata su Sliding i dati vengono memorizzati durante la prima operazione di recupero dati, e ripristina l'intervallo di tempo durante il quale i dati vengono mantenuti nella cache per ogni operazione successiva.
    La cache scadrà se non viene registrata alcuna attività per un periodo di tempo uguale al valore settato nella CacheDuration.
  • CacheKeyDependency - SqlCacheDependency: Permette di creare una dipendenza da un oggetto in cache ad un'altro (CacheKeyDependency) o con una tabella nel database (SqlCacheDependency).

SqlDataSource


<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"
EnableCaching="true"
CacheDuration="600"
CacheExpirationPolicy="Absolute"
SelectCommand="SELECT * FROM Person.Contact">
<SelectParameters>
<asp:Parameter DefaultValue="1" Name="EmailPromotion" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>

Per questo esempio ottengo tutti i dati dalla tabella Person.Contact del database AdventureWorks che potete trovare su CodePlex.
Test alla mano, ottenuti con Fiddler, la differenza tra i dati non copiati in cache e quelli copiati in cache è del 10% di tempo impiegato tra la request e il respond.

ObjectDataSource

L'ObjectDataSource è molto limitato, lavora solamente DataSet e/o DataTable.
Se utilizzato con un'altro tipo di oggetto riceveremo un NotSupportedException.

Se si vorranno copiare nell'ObjectDataSource cache oggetti diversi dai due sopra menzionati, bisognerà implementare anche i metodi di inserimento dei dati.

No comments:

Post a Comment