欢迎光临
我们一直在努力

ASP.NET2.0中的SqlCacheDependency特性-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

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的安装目录下(通常是windows\microsoft.net\framework\v1.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、明天开始上班啦!!!
  
  春节假期终于完了,这个春节没有回家,留在深圳过年。今年深圳春节真冷啊,呜呜…家里又没有宽带,只能拨号上网,痛苦不堪。从明天开始,又要开始工作了,不知道要几天才能恢复春节颠倒过来的生物钟。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP.NET2.0中的SqlCacheDependency特性-.NET教程,Asp.Net开发
分享到: 更多 (0)