返回“ASP.NET 2.0数据教程目录”
导言:
在58和59章探讨的缓存技术使用的是基于时间的缓存周期,当 过了某段时间后便将缓存数据从内存清除。当设置缓存时间为x秒时,数据在x秒 内都是“新”的。当然,就像在60章谈到的那样,对静态数据来说,x 可延伸到web应用程序的整个生命周期(lifetime)。
当缓存数据时,基于 时间周期的技术因为其易用性而常常被采用,不过又常常不那么完美。理想的状 态是这样的:数据库数据还是应缓存在内存,直到源数据(underlying data)发生 改变时才从内存清除。这样的话可以最大化的获取缓存带来的性能上的好处,同 时使“过时数据”(stale data)持续的时间最短。然而,为此,我们 需要建立一种机制来探测数据库数据什么时候发生了改变,并将对应的缓存条目 清除掉。
ASP.NET 2.0提供的SqlCacheDependency class类和必要的下部 基础构造(infrastructure)可以判断数据库什么时候发生了更改,以便将对应的 缓存条目从内存清除掉。有2种技术可以判断源数据在什么时候发生了改变: polling 和notification。讨论完这2者之间的差别后,我们将创建必要的下部基 础构造来支持polling,然后探讨如何使用SqlCacheDependency class类
理解Notification and Polling
正如前面所述,有2种方法来判断一个数 据库里的数据在什么时候修改过:notification 和 polling.当使用 notification的时候,数据库提示(alerts)ASP.NET对应某个具体查询的数据已经 发生了改变;于是对应的缓存条目将被清除。使用polling的时候,数据库服务器 将包含某个表(tables)最近发生更改时的相关信息。ASP.NET周期性的对数据库进 行检查,看哪些表在数据被缓存以后发生过改动,若改动过,对应的缓存条目将 被清除。
notification是对查询(query)而不是表(table)进行跟踪检查, 相对polling而言,需要采取的步骤要少些。不过遗憾的是,只有在Microsoft SQL Server 2005的完整版(也就是non-Express版本)才能使用该功能。而 Microsoft SQL Server的所有版本,从7.0 到2005都可以使用polling功能,因为 本系列教程使用的是SQL Server 2005的Express版本,在此我们将集中探讨建立 和使用polling。关于SQL Server 2005的notification功能,你可以参阅本文结 束部分的Further Reading。
要使用polling,我们将设置数据库包含一个 名为AspNet_SqlCacheTablesForChangeNotification的表。该表有3列: tableName, notificationCreated, 和changeId.对于哪些在web应用程序的SQL cache dependency里要用到的表,该表都有一条记录与之对应。tableName就是具 体某个表的名称;notificationCreated指明了添加记录时的date 和 time;而列 changeId的类型是int,初始值是0,每当对应的表发生一次改动,其值就自动增 加一次。
除了表AspNet_SqlCacheTablesForChangeNotification外,数据 库还需要为出现在SQL cache dependency里的每个表包含一个触发器(triggers), 任何时候,只要表插入、更新、删除一条记录或在表 AspNet_SqlCacheTablesForChangeNotification里的对应的changeId值增大的情 况下就会执行触发器。
当使用SqlCacheDependency对象(object)来缓存数 据时,ASP.NET将关注某个表的当前(current)的changeId值,一旦发现当前其值与 数据库里面的changeId值不同时,就将该SqlCacheDependency对象清除。因为, changeId不吻合就意味着在完成数据缓存后,表又发生过改动。