数据源控件缓存

使用数据源控件缓存是非常提倡的,因为数据源控件经常生成一些大量的查询请求。比如,当参数改变后,会重新请求。为每一个绑定控件执行分开的查询,即使这些控件使用的汉斯相同的命令,这样,即使很小的缓存也能减小开销。

 

尽管很多数据源控件支持缓存,但是数据源支持缓存不是必须具备的特征,有些数据源也不支持缓存,比如SiteMapDataSource。

为了支持缓存,数据源控件使用了相同的属性。

EnableCaching ,CacheExpirationPolicy ,CacheDuration ,CacheKeyDependency 和SqlCacheDependency。自行查阅msdn看这些属性的意义。

当你使用SqlDataSource 控件缓存时,你缓存的是selectquery的结果。当你创建了一个带有参数的查询,SqlDataSource将为每个参数缓存独立的结果。看如下代码:

<asp:SqlDataSource ID="sourceEmployees" runat="server" 
ProviderName="System.Data.SqlClient" 
ConnectionString="&lt;%$ ConnectionStrings:Northwind %>" 
SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees 
WHERE City=@City"&gt; 
<SelectParameters> 
<asp:ControlParameter ControlID="lstCities" Name="City" 
PropertyName="SelectedValue" /> 
</SelectParameters> 
</asp:SqlDataSource> 
在这例子里,每次你选择城市,一个独立的查询会执行,这个查询混填充到DataSet,这个DataSet然后被缓存。如果你选择一个不同的城市,这个步骤会再做一次,一个新的Dataset会被独立的缓存,但是当你选了一个你选过的城市,那么这个dataset会从缓存中取出。

SqlDataSource只有在DataSourceMode属性被设置成DataSet的时候才缓存,被设置为DataReader的时候不缓存,因为DataReader和数据库之间保存了一个活的链接。

如果针对某些参数值所用的查询非常频繁,那么缓存各自独立的结果会非常有效。 
反之,如果各个参数值使用频率相似,那么这种方法不太合适,因为,当缓存项过期,你将需要多个数据库查询来重新填充缓存,每个参数值一个,这不如把所有的缓存合并到一个缓存中有效。 
在这种情况下,你能改变SqlDataSource ,让根据员工记录获取dataset,然后缓存。这样SqlDataSource 能够抽取满足请求的记录,这样,一个有着所有缓存记录的dataset,能够满足任何参数值,使用这种技术,你要重写SqlDataSource ,使用filtering。 
<asp:SqlDataSource ID="sourceEmployees" runat="server" 
ProviderName="System.Data.SqlClient" 
ConnectionString="&lt;%$ ConnectionStrings:Northwind %>" 
SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees" 
FilterExpression="City='{0}'" EnableCaching="True"&gt; 
<FilterParameters> 
<asp:ControlParameter ControlID="lstCities" Name="City" 
PropertyName="SelectedValue" /> 
</FilterParameters> 
</asp:SqlDataSource>

注意,不要使用filtering,除非你在使用缓存。不然效率会很差,你每次去除全部数据,然后在过滤出自己想要的,效率太差了。



















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/589169,如需转载请自行联系原作者