SQL 缓存失效 2.0 版中的新增功能

发布时间: 2007-01-28 11:38    作者: 未知    来源: 未知    浏览:    评论

SQL 缓存失效 2.0 版中的新增功能

在前一个示例中,无论数据在数据库中是否已更改,数据都被缓存 60 秒。SQL 缓存失效使您可以使缓存项依赖于数据库,因此缓存项仅在数据库中的数据更改时才被清除。

基于轮询的失效

此机制使用轮询检查表自从页被缓存以来是否已更新。若要启用基于表的缓存,需要执行以下步骤:

1) 使用 aspnet_regsql.exe 工具为数据库启用通知。
>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -ed
此步骤只需为每个数据库执行一次。

2) 使用 aspnet_regsql.exe 工具为希望依赖的表启用通知。
>aspnet_regsql.exe -S ".\SQLExpress" -E -d "pubs" -et -t "authors"
3) 在应用程序的配置中注册通知。
<system.web>    <caching>      <sqlCacheDependency enabled="true" pollTime="1000" >        <databases>          <add name="PubsDB" connectionStringName="Pubs" />        </databases>      </sqlCacheDependency>    </caching></system.web>
轮询时间指定应用程序每隔多长时间检查数据是否已更改。

4) 然后就可以在 OutputCache 指令上使用一个 SQL 依赖项:
<%@ OutputCache Duration="999999" SqlDependency="Pubs:Authors" VaryByParam="none" %>
或者依赖项也可以直接在数据源控件上指定:
<asp:SqlDataSource EnableCaching="true" CacheDuration="Infinite" SqlCacheDependency="PubsDB:Authors" ... />
下面的示例使用 sql 数据源(使用基于表的通知)的输出缓存。监视应用程序底部的时间戳,该时间戳应保持为静态。可以使用 GridView 示例来编辑数据。刷新页应可显示更新的数据和新的时间戳。

C# SqlCacheDependency
Run Sample View Source

Sql Server 2005 基于通知的缓存失效

此机制使用 Sql Server 2005 的查询更改通知机制来检测查询结果的更改。与 Sql Server 7.0 和 2000 的基于轮询的失效不同,基于通知的失效所需的设置要少得多。

  1. 与基于轮询的失效不同,无需在应用程序的配置中注册任何 <sqlCacheDependency>。而且,无需使用 aspnet_regsql.exe 工具进行任何特殊配置。

  2. 基于通知的依赖项是使用字符串 CommandNotification 在 OutputCache 指令上 配置的。此值告知 ASP.NET 应为页或数据源控件创建基于通知的 依赖项。

    在页上:
    <%@ OutputCache Duration="999999" SqlDependency="CommandNotification" VaryByParam="none" %>
    在数据源控件上:
    <asp:SqlDataSource EnableCaching="true" SqlCacheDependency="CommandNotification" CacheDuration="Infinite" ... />
  3. 在首次执行某 SQL 查询之前,必须在应用程序某处调用 System.Data.SqlClient.SqlDependency.Start() 方法。此方法应放在 global.asax 文件的 Application_Start() 事件中。
每当向 Sql Server 2005 发出一个命令时,ASP.NET 和 ADO.NET 都会自动创建一个缓存依赖项,该缓存依赖项侦听从 Sql Server 发送的更改通知。当数据在 Sql Server 中更改时,这些通知会使得缓存的查询在 Web 服务器上失效。当下一次请求与依赖项相关联的页或数据源控件时,将再次执行该页或数据源控件,而不是提供缓存的信息。

阻止查询使用 Sql Server 2005 查询通知的常见问题是:
  1. 查询的 SELECT 语句中必须显式包含列名。使用“SELECT *”将使查询不会在 Sql Server 2005 查询通知中注册。
  2. 查询中的表名必须包括所有者名称。例如,如果对 pubs 数据库中的 authors 表发出一个查询,则该查询必须用“dbo.authors” 来引用表。
  3. 运行查询的安全标识必须具有在 Sql Server 2005 中注册查询通知的权限。此权限可以使用下面的 T-SQL 命令来授予:GRANT SUBSCRIBE QUERY NOTIFICATIONS TO username
  4. 运行查询的安全标识还必须具有从 Sql Server 2005 发送查询通知的权限。此权限可以使用下面的 T-SQL 命令来授予:GRANT SEND ON SERVICE::SqlQueryNotificationService TO username
注意: 对支持查询通知的查询语法有许多限制。有关具体约束的列表,请参见 Sql Server 2005 Books Online(《Sql Server 2005 联机丛书》)中的主题“创建用于通知的查询”。另外,如果出现查询未被缓存,而是在每个页请求上都执行的情况,则可能是查询没有遵守 Sql Server 2005 所要求的约束,或是 Sql Server 2005 在尝试设置该查询的通知时产生错误。目前,当尝试在 ASP.NET 中设置缓存依赖项时,这些条件中的任何一个都会导致没有任何提示的错误,其最终结果是缓存依赖项始终失效,并因此使得所有相关联的查询始终会在每个页请求上执行。 
 

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多