使用数据源控件缓存数据
更新:2007 年 11 月
数据源控件为 GridView、FormView 和 DetailsView 等数据绑定控件提供数据服务。这些服务包括缓存数据。如果应用程序中的数据更改不频繁,则缓存数据有助于改进应用程序的性能。
要使用 SqlDataSource 或 AccessDataSource 控件缓存数据,必须将这些控件的 DataSourceMode 属性设置为 DataSet。ObjectDataSource 控件可以缓存基础业务对象返回的对象。但是,如果对象存放资源或保持不能在多个请求之间共享的状态,则不能缓存该对象,例如,打开的 DataReader 对象就是这样的对象。
对数据源控件启用缓存
默认情况下并不对数据源控件启用缓存,但通过将数据源控件的 EnableCaching 属性设置为 true 可以启用缓存。缓存数据将基于您使用 CacheDuration 属性指定的秒数进行刷新。
通过设置数据源控件的 CacheExpirationPolicy 属性,您可以进一步改进数据源控件的缓存行为。通过将该属性的值设置为 Absolute,可以强制在超过 CacheDuration 值时刷新缓存。通过将 CacheExpirationPolicy 属性设置为 Sliding,可以只在自上一次访问缓存项以来所经过的时间超过了 CacheDuration 值时才刷新缓存。
重要说明: |
---|
建议您在启用了客户端模拟并根据客户端标识检索数据源中的结果时,将 EnableCaching 属性设置为 false。如果启用了缓存,则单个用户的缓存数据会被所有用户看到,并且敏感信息可能公开给有害源。如果 identity 配置元素的 impersonate 属性设置为 true 且对 Web 服务器上的应用程序禁用匿名标识,则说明启用了客户端模拟。 |
下面的代码示例演示配置为每 20 秒刷新一次数据的 SqlDataSource 控件:
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataSet"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
EnableCaching="True"
CacheDuration="20"
SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="SqlDataSource1">
<columns>
<asp:BoundField HeaderText="First Name" DataField="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField="LastName" />
<asp:BoundField HeaderText="Title" DataField="Title" />
</columns>
</asp:GridView>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataSet"
ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
EnableCaching="True"
CacheDuration="20"
SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="SqlDataSource1">
<columns>
<asp:BoundField HeaderText="First Name" DataField="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField="LastName" />
<asp:BoundField HeaderText="Title" DataField="Title" />
</columns>
</asp:GridView>
</form>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:SqlDataSource
id="SqlDataSource1"
runat="server"
DataSourceMode="DataSet"
ConnectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
EnableCaching="True"
CacheDuration="20"
SelectCommand="SELECT EmployeeID,FirstName,LastName,Title FROM Employees">
</asp:SqlDataSource>
<asp:GridView
id="GridView1"
runat="server"
AutoGenerateColumns="False"
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField HeaderText="First Name" DataField="FirstName" />
<asp:BoundField HeaderText="Last Name" DataField="LastName" />
<asp:BoundField HeaderText="Title" DataField="Title" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
高级缓存方案
如果要将 SqlDataSource 控件与 System.Data.SqlClient 提供程序一起使用,可以利用 SqlCacheDependency 类来确保只有当数据库中的源表已修改时才刷新缓存的数据。有关更多信息,请参见 使用 SqlDataSource 控件缓存数据。