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.
posted @ sabato 3 gennaio 2009 20:19