现在的位置: 首页 > 综合 > 正文

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

2012年01月22日 ⁄ 综合 ⁄ 共 1639字 ⁄ 字号 评论关闭

此机制使用   Sql   Server   2005   的查询更改通知机制来检测查询结果的更改。与   Sql   Server   7.0   和   2000   的基于轮询的失效不同,基于通知的失效所需的设置要少得多。  
与基于轮询的失效不同,无需在应用程序的配置中注册任何   <sqlCacheDependency> 。而且,无需使用   aspnet_regsql.exe   工具进行任何特殊配置。  
基于通知的依赖项是使用字符串   CommandNotification   在   OutputCache   指令上   配置的。此值告知   ASP.NET   应为页或数据源控件创建基于通知的   依赖项。  
在页上:  
<%@   OutputCache   Duration= "999999 "   SqlDependency= "CommandNotification "   VaryByParam= "none "   %>
在数据源控件上:  
<asp:SqlDataSource   EnableCaching= "true "   SqlCacheDependency= "CommandNotification "   CacheDuration= "Infinite "   ...   />
在首次执行某   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   查询通知的常见问题是:
查询的   SELECT   语句中必须显式包含列名。使用“SELECT   *”将使查询不会在   Sql   Server   2005   查询通知中注册。  
查询中的表名必须包括所有者名称。例如,如果对   pubs   数据库中的   authors   表发出一个查询,则该查询必须用“dbo.authors”   来引用表。  
运行查询的安全标识必须具有在   Sql   Server   2005   中注册查询通知的权限。此权限可以使用下面的   T-SQL   命令来授予:GRANT   SUBSCRIBE   QUERY   NOTIFICATIONS   TO   username。  
运行查询的安全标识还必须具有从   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   中设置缓存依赖项时,这些条件中的任何一个都会导致没有任何提示的错误,其最终结果是缓存依赖项始终失效,并因此使得所有相关联的查询始终会在每个页请求上执行。  

抱歉!评论已关闭.