帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程
ASP.NET 2.0 中的SqlCacheDependency特性
作者:kanyboy 发布时间:2005-03-12 来源:ASPCOOL
     ASP.NET中的Page Cache是个很有用的东东,只要简单的在页面上方加上一个OutputCache标签,就可以让页面在制定的Duration内直接把自动保存在缓存中的页面内容输出,而不需要让ASP.NET引擎再次执行页面代码,当然,节省这点执行时间并不是最主要的理由,主要理由是如果页面内容是从数据库中取出,那么就可以省去连接数据库、取数据的步骤,这个好处可大了。
  
   PageCache有点小小的问题,比如,很多ASP.NET论坛的首页就用了PageCache,所以在一个版里面贴出的最新的帖子并不会马上反映到首页上,而是需要等上一段时间。虽然有点无可奈何,但在某些场合(比如易趣用来显示物品拍卖状态的页面),这种延迟是不允许的。
  
   也即是说,ASP.NET里面的Cache并不能自动根据数据库中相应数据发生了变化,而使相应的Cache过期,ASP.NET 2.0中新增的SqlCacheDependency特性使这成为了可能。(当然,只要我们明白了ASP.NET 2.0中的大致实现方式,我们可以基于ASP.NET 1.0把这个特点实现出来,后面我总结了相应的方法。)
  
   要在ASP.NET 2.0中应用SqlCacheDependency特性,步骤如下(基于大家手里的Whidbey PDC版本):
  
   1、 使数据库支持SqlCacheDependency
   在.Net Framework 1.2的安装目录下(通常是WINDOWSMicrosoft.NETFrameworkv1.2.30703),有一个aspnet_regsqlcache.exe,这个命令行工具让我们的SqlServer 7.0或者SqlServer 2000能支持SqlCacheDependency特性,
  
   首先:“aspnet_regsqlcache –S 服务器名称 –U 登陆ID –P 密码 –d 数据库名称 –ed”,这个命令使指定数据库支持SqlCacheDependency,
  
   然后我们再加入要追踪的数据表:“aspnet_regsqlcache –S 服务器名称 –U 登陆ID –P 密码 –d 数据库名称 –t 要追踪的数据表的名称 –et”,这个命令使指定的Table支持SqlCacheDependency。
  
   它在幕后做了什么事情呢?
  
   首先,它在指定的数据库中新建了一个Table,叫做“AspNet_SqlCacheTablesForChangeNotification”,这个表有三个字段,“tableName”记录要追踪的数据表的名称,“notificationCreated”记录开始追踪的时间,“changeId”是一个int类型的字段,每当追踪的数据表的数据发生变化时,这个字段的值就加1。
  
   它还会在指定的数据库中增加几个存储过程,用来让ASP.NET引擎查询追踪的数据表的情况。
  
   然后,它会给我们要追踪的Table加上几个Trigger,分别对应到Insert、Update、Delete操作,这几个Trigger的语句非常简单,就是把“AspNet_SqlCacheTablesForChangeNotification”表中对应“tableName”字段为这个追踪的表的名称的记录的“changeId”字段加上一个1。
  
   ASP.NET引擎通过执行它加上的存储过程“AspNet_SqlCachePollingStoredProcedure”,这个存储过程直接返回“AspNet_SqlCacheTablesForChangeNotification”表的内容,让ASP.NET引擎知道哪个表的数据发生的变化。默认每500毫秒执行这个存储过程一次,不过可以在web.config里面修改这个间隔时间,我的经验是这个查询操作也是很耗资源的,呵呵。
  
   2、 web.config配置
  
   在web.config里面的配置再简单不过了
  
  
   <configuration>
  
   <!-- 加上合适的数据库连接字符串 -->
  
   <connectionStrings>
  
   <add name="SqlServerConnectionString"
  
   connectionString="server=sqlserver1;uid=sa;pwd=
  
   password;database=PortalDB " />
  
   </connectionStrings>
  
   <system.web>
  
   <!-- 配置Cache一段,使之支持SqlCacheDependency -->
  
   <cache>
  
   <sqlCacheDependency enabled="true" pollTime="500">
  
   <databases>
  
   <add name=" PortalDB "
  
   connectionStringName=" SqlServerConnectionString " />
  
   </databases>
  
   </sqlCacheDependency>
  
   </cache>
  
   </system.web>
  
   </configuration>
  
  
  
   3、 在页面上的outputCache标签中指定SqlCacheDependency特性:
  
  
  
   <%@ outputcache duration="9999" varybyparam="None" sqldependency="PortalDB:追踪的数据表名称" %>
  
  
  
   只要在这个追踪的Table上执行了Insert、Update、Delete操作,数据表上的Trigger就会将数据库中“AspNet_SqlCacheTablesForChangeNotification”表的相应记录的相应“changId”字段值修改,然后ASP.NET引擎就会通过获取新的值来得知追踪的Table的内容发生了变化,自动使这个页面的cache失效。
  
  
  
   后话1、What about Yukon?
  
  
  
   从上面可以知道,SqlServer并没有内置自动追踪数据表的数据变化,然后通知ASP.NET引擎的功能(这是肯定的,SqlServer都出来N久了),所以ASP.NET 2.0的开发组人为的加上了定制的Table、Trigger、StoredProcedure等等来实现数据更改追踪。而Yukon已经不必这么麻烦了,Yukon内置了一个Notification Delivery Service,这个服务会通过WebServer的80端口直接通知一个IIS内置的监听器,然后这个监听器再通知ASP.NET。
  
  
  
   而且大家可以注意到,上面描述的那种追踪方式只能追踪到表一级的数据更改,即ASP.NET引擎最后只能得知某个表的数据发生了更改,而到底是哪一条记录发生了更改,是追踪不到的,而Yukon的Notification Delivery Service可以实现记录一级的追踪。
  
  
  
   后话2、可以在现在的ASP.NET上实现吗?
  
  
  
   当然可以,我们先按照上面讲的第一个步骤(或者自己定义一套规则来实现在数据库中对Table数据变化的追踪),依照葫芦画瓢来自己添加上这些Table、Trigger什么的。
  
  
  
   ASP.NET的PageCache有一个VaryByCustom属性的,这个属性可以实现让我们自己定义“缓存过期”的规则(确切的说,其实它是可以让我们自定义缓存页的版本,但间接可以实现自定义的缓存“过期”啦,呵呵),只要我们在global.asa中重写HttpApplication.GetVaryByCustomString()方法,这个方法根据输入的参数字符串,比如“CheckDBTable=Users”,查询数据库中那个“AspNet_SqlCacheTablesForChangeNotification”(或者你自己定义的某个追踪记录表),直接让这个GetVaryByCustomString()方法返回“changeId”字段的值即可。VaryByCustom的用法MSDN文档上有详细说明。
  
  
  
   后话3、GolfClubShack示范程序
  
   在博客堂前面的某篇文章里面,提供了一个基于ASP.NET 2.0的GolfClubShack站点的示范程序,是非常好的东东,在那个里面可以看到包括SqlCacheDependency在内的众多ASP.NET 2.0的特性的体现。现在网上完整的ASP.NET 2.0的示范程序不多,听说MS内部已经把IBuySpy移植到ASP.NET 2.0上面了,不知详情如何。而MS还在alpha阶段的AspNetForums 2.0还是基于.Net Framework 1.1的(我以前一直是以为是基于最新的ASP.NET 2.0的,安装了好半天,晕...)。
  
  
  
   后话4、明天开始上班啦!!!
  
   春节假期终于完了,这个春节没有回家,留在深圳过年。今年深圳春节真冷啊,呜呜…家里又没有宽带,只能拨号上网,痛苦不堪。从明天开始,又要开始工作了,不知道要几天才能恢复春节颠倒过来的生物钟。
  
   http://blog.joycode.com/kaneboy/
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·[ASP.NET] Session 详解  (2005-03-12)
 ·ASP.NET中的Http Handles  (2005-03-12)
 ·ASP.NET 2.0,无刷新页面新境界!  (2005-03-12)
 ·如何在命令行下编译一个asp.net项  (2005-03-12)
 ·使用反射将业务对象绑定到 ASP.N  (2005-03-12)
 ·提高ASP.Net应用程序性能的十大方  (2005-03-12)
 ·提高ASP.Net应用程序性能的十大方  (2005-03-12)
 ·ASP.NET中数据库数据导入Excel并  (2005-03-12)
 ·ASP.NET中数据库数据导入Excel并  (2005-03-12)
 ·ATL Server 与 ASP.NET  (2005-03-12)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·DiscuzX2.5会员整合通行证发布
·帝国CMS 7.0版本功能建议收集
·帝国网站管理系统2012年授权购买说
·PHPWind8.7会员整合通行证发布
·[官方插件]帝国CMS-访问统计插件
·[官方插件]帝国CMS-sitemap插件
·[官方插件]帝国CMS内容页评论AJAX分
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统