数据源控件缓存
使用数据源控件缓存是非常提倡的,因为数据源控件经常生成一些大量的查询请求。比如,当参数改变后,会重新请求。为每一个绑定控件执行分开的查询,即使这些控件使用的汉斯相同的命令,这样,即使很小的缓存也能减小开销。
尽管很多数据源控件支持缓存,但是数据源支持缓存不是必须具备的特征,有些数据源也不支持缓存,比如SiteMapDataSource。
为了支持缓存,数据源控件使用了相同的属性。
EnableCaching ,CacheExpirationPolicy ,CacheDuration ,CacheKeyDependency 和SqlCacheDependency。自行查阅msdn看这些属性的意义。
当你使用SqlDataSource 控件缓存时,你缓存的是selectquery的结果。当你创建了一个带有参数的查询,SqlDataSource将为每个参数缓存独立的结果。看如下代码:
<asp:SqlDataSource ID="sourceEmployees" runat="server"
ProviderName="System.Data.SqlClient"
ConnectionString="<%$ ConnectionStrings:Northwind %>"
SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees
WHERE City=@City">
<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="<%$ ConnectionStrings:Northwind %>"
SelectCommand="SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees"
FilterExpression="City='{0}'" EnableCaching="True">
<FilterParameters>
<asp:ControlParameter ControlID="lstCities" Name="City"
PropertyName="SelectedValue" />
</FilterParameters>
</asp:SqlDataSource>
注意,不要使用filtering,除非你在使用缓存。不然效率会很差,你每次去除全部数据,然后在过滤出自己想要的,效率太差了。