SqlDataSource 控件可对它检索过的数据进行缓存,这样可以避免再次运行资源消耗量较大的查询,从而提高应用程序的性能。缓存主要用于数据变化不频繁的情况。
此外,当通过 System.Data.SqlClient 提供程序使用 SqlDataSource 控件时,可以使用 SqlCacheDependency 对象。这样可使 SqlDataSource 控件仅在 SelectCommand 返回的数据在数据库中被修改时才刷新缓存。
一、通过 SqlDataSource 控件启用缓存
当 SqlDataSource 控件的 DataSourceMode 属性设置为 DataSet 时,该控件可对数据进行缓存。默认情况下并未启用缓存,但可以通过将 EnableCaching 属性设置为 true 来启用缓存。
将基于一个时间间隔对缓存数据进行刷新。可以将 CacheDuration 属性设置为刷新缓存之前要等待的秒数。SqlDataSource 控件为每个 ConnectionString、SelectCommand 和 SelectParameters 值的组合维护一个单独的缓存项。
通过设置 CacheExpirationPolicy 属性,可以进一步控制 SqlDataSource 缓存的行为。Absolute 值会在超过 CacheDuration 值时强制刷新缓存。将 CacheExpirationPolicy 属性设置为 Sliding,则仅在从最后一次访问缓存项起超过 CacheDuration 值之后才对缓存进行刷新。
下面的代码示例演示一个 SqlDataSource 控件,该控件配置为每 20 秒刷新一次数据:
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<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>
二、使用 SqlCacheDependency 对象
SqlDataSource 控件支持基于 SqlCacheDependency 对象的可选过期策略。可以使用 SqlCacheDependency 对象来确保仅在修改了数据库中的源表时才对缓存数据进行刷新。为了使用 SqlCacheDependency 对象,必须为数据库服务器运行 Microsoft SQL Server 通知服务。
如果您的数据源为 SQL Server 7.0 或更高版本,则您可通过将 SqlDataSource 控件的 SqlCacheDependency 属性设置为由一个连接字符串和表标识符组成的字符串(形式为“ConnectionString:Table”),来使用 SqlCacheDependency 对象对数据库进行轮询以检查更改。如果 SqlCacheDependency 涉及多个表,则连接字符串和表名称对以分号分隔,如下面的示例所示:
“ConnectionString1:Table1;ConnectionString2:Table2”。
如果数据源是 Microsoft SQL Server 2005,则还可以选择让 SQL Server 向应用程序通知更改,而不用轮询检查更改。通过将 SqlCacheDependency 属性设置为字符串“CommandNotification”,可以使用该通知模型。
下面的代码示例演示如何创建 Microsoft SQL Server 缓存依赖项,以及如何设置 SqlDataSource 控件的 SqlCacheDependency 属性。在该示例中,每 120 秒对数据库进行一次轮询。如果在这段时间内 Northwind Employees 表中的数据发生更改,则下次对数据库进行轮询时将对由 SqlDataSource 控件缓存和 GridView 控件显示的数据进行刷新。
<%@ Page language="c#" %>
<!--
The page uses an example configuration that includes
connection strings and a defined SqlCacheDependecy.
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="MyNorthwind"
connectionString="Data Source="localhost";Integrated Security="SSPI";Initial Catalog="Northwind""
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
<cache>
<sqlCacheDependency enabled="true">
<databases>
<add
name="Northwind"
connectionStringName="MyNorthwind"
pollTime="120000" />
</databases>
</sqlCacheDependency>
</cache>
</system.web>
</configuration>
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html >
<head runat="server">
<title>ASP.NET Example</title>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:gridview
id="GridView1"
runat="server"
datasourceid="SqlDataSource1" />
<asp:sqldatasource
id="SqlDataSource1"
runat="server"
connectionstring="<%$ ConnectionStrings:MyNorthwind%>"
selectcommand="SELECT EmployeeID,FirstName,Lastname FROM Employees"
enablecaching="True"
cacheduration="300"
cacheexpirationpolicy="Absolute"
sqlcachedependency="Northwind:Employees" />
</form>
</body>
</html>