ASP.NET 2.0数据教程之六十一:使用SQL Cache Dependencies

返回“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不吻合就意味着在完成数据缓存后,表又发生过改动。

时间: 2024-09-13 19:08:26

ASP.NET 2.0数据教程之六十一:使用SQL Cache Dependencies的相关文章

ASP.NET 2.0数据教程之十一:基于数据的自定义格式化

本系列文章导航 ASP.NET 2.0数据教程之一:创建一个数据访问层 ASP.NET 2.0数据教程之二:创建一个业务逻辑层 ASP.NET 2.0数据教程之三:母板页和站点导航 ASP.NET 2.0数据教程之四:使用ObjectDataSource展现数据 ASP.NET 2.0数据教程之五:声明参数 ASP.NET 2.0数据教程之六:编程设置ObjectDataSource的参数值 ASP.NET 2.0数据教程之七:使用DropDownList过滤的主/从报表 ASP.NET 2.0

ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map

返回"ASP.NET 2.0数据教程目录" ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map Provider 导言: ASP.NET 2.0的网站地图(site map)功能允许页面开发者在一些 持久介质(persistent medium),比如一个XML文件里,自己定义一个web程序的 site map.一旦定义了之后,我们可以通过System.Web命名空间的SiteMap class 类或某个Web导航控件,比如Si

ASP.NET 2.0数据教程之七十一:处理Computed Columns列

返回"ASP.NET 2.0数据教程目录" 导言: Microsoft SQL Server里有一种computed columns列.这种列的 值是通过一个表达式来计算,而表达式引用的是同一张表的其它列的值.打个比方 ,有一张ServiceLog表,其包含了ServicePerformed, EmployeeID, Rate, Duration等列. 虽然我们可以在一个web页面或其它什么界面里计算每笔服务的费 用(也就是 比率 rate乘以时间段duration),不过我们也可以手

ASP.NET 2.0数据教程之六十九:在TableAdapter里使用JOINs

返回"ASP.NET 2.0数据教程目录" 导言: 在关系数据库里,我们处理的数据通常跨越了几个数据表.举 例:当展示产品信息时我们很可能想列出每个产品相应的category以及供应商的 名称等.诚然,Products表里包含有CategoryID 和SupplierID值,但是事实上的 category以及supplier names分别定义在Categories表和Suppliers表里. 要从其 它的相关表里获取信息,我们可以使用correlated subqueries或JOI

ASP.NET 2.0数据教程之六十八:在TableAdapters里使用现有的存储过程

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的文章里我们考察了如何让TableAdapters向导自动的创 建存储过程.而在本文,我们将考察如何让TableAdapter使用现有的存储过程.由 于Northwind数据库现有的存储过程很少,我们也需要考察如何在Visual Studio 环境里手动向数据库添加新的存储过程. 注意: 在第63章 <Wrapping Database Modifications within a Transaction>里我们向

ASP.NET 2.0数据教程之六十七:在TableAdapters里创建新的存储过程

返回"ASP.NET 2.0数据教程目录" 导言: 本教程的Data Access Layer (DAL)使用的是类型化的数据集 (Typed DataSets).就像我们在第一章<Creating aData Access Layer>里探讨 的一样,该类型化的数据集由强类型的DataTable和TableAdapter构成. DataTable描绘的是系统里的逻辑实体而TableAdapter引用相关数据库执行数据访 问,包括对DataTable填充数据.执行返回标量数

ASP.NET 2.0数据教程之六十六:批添加数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的第64章<Batch Updating>里,我们用GridView控件 里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情 况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea 和 coffee,如果 用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的 值,比如相同的种类(Beverages),相同的供应商(Tokyo Traders),相同的 d

ASP.NET 2.0数据教程之六十五:批删除数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程,我们用GridView创建了一个批编辑界面.在用户需 要一次性编辑多条记录的情况下,批编辑界面很有用.同理,当用户需要同时删 除多条记录时,该技术也很有用. 如果你使用过邮件系统的话,你应该对 这种最常见的批删除界面很熟悉:界面里每一行都包含一个checkbox,此外,还 有一个"Delete All Checked Items"按钮(如图1).本教程比较短, 因为我们在前面的教程已经完成大体的框架,

ASP.NET 2.0数据教程之六十四:批更新数据

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程,我们对数据访问层进行扩展以支持数据库事务. 数据库事务确保一系列的操作要么都成功,要么都失败.本文我们将注意力转到 创建一个批更新数据界面. 在本文,我们将创建一个GridView控件,里面 的每一行记录都可以进行编辑(见图1),因此我们没有必要多添加一列来包含 Edit, Update,和Cancel按钮,而是在页面包含2个"Update Products"按钮,被点击时,遍历所有的产品并对数据库进