16.3 缓存依赖类:CacheDependency类
CacheDependency类是架设在Cache类和实际数据之间的桥梁。本节将详细介绍如何利用CacheDependency类实现数据缓存的及时更新。
16.3.1 功能说明
CacheDependency类被称为是缓存依赖类,其具体意义表现在当缓存对象的实际数据发生改变时,它能及时通知缓存对象。例如缓存对象“Category”保存的是一个XML文件的数据,如果XML文件发生了变化,那么系统通过CacheDependency类就会及时更新缓存对象“Category”的内容,这样就能保证用户读取的永远是最新的数据。
16.3.2 语法定义
CacheDependency类的语法定义如下:
public class CacheDependency : IDisposable
其中继承了接口“IDisposable”,此接口主要用来定义释放分配的非托管资源的方法。继承此接口必须实现方法Dispose,以实现资源的释放。
CacheDependency类的构造函数实现了8个重载,下面的代码列出了这些重载的函数,并详细说明了各函数的参数。了解这些函数就可以知道CacheDependency究竟能为缓存带来什么优势。
new string[] { "Category", "Category1" }, mydep,DateTime.Now);
16.3.3 方法和属性
虽然CacheDependency类完成了很重要的功能,但其组成结构却比较简单,主要有两个属性和一个方法。
— 属性“HasChanged”:判断CacheDependency对象是否已更改。
— 属性“UtcLastModified”:返回上次依赖项的修改日期
— 方法“Dispose”:释放CacheDependency对象所占有的资源。因为缓存类继承了接口“IDispose”,所以必须实现此方法。
由于缓存类的构成比较简单,本节并没有给出演示代码,属性和方法的使用将在下一节的实例中演示。
注意:只有Cache类的Insert和Add方法才可以为缓存添加依赖项。
16.3.4 典型应用:用CacheDependency获取最新的数据
本例主要演示如何使用CacheDependency类实现数据的及时更新。实例中使用一个GridView控件显示XML文件的数据,当XML文件的数据发生改变时,客户端可以及时更新。其实现的功能如图16-3所示。
图16-3
演示的详细步骤如下所述。
<?xml version="1.0" encoding="utf-8" ?>
<book>
</book>
private static CacheDependency mydepen;
protected void Page_Load(object sender, EventArgs e)
{
}
注意:使用XML文件读取方法,必须添加XML操作方法所在的命名空间“System.Xml”。
protected void Button1_Click(object sender, EventArgs e)
{
CacheItemPriority.Normal, null);
}
注意:当XML文件发生改变后,其实缓存依赖和缓存项都被移除了,必须重新定义。
图16-4
16.4 数据库缓存依赖类:SqlCacheDependency类
数据库缓存依赖主要解决的是当数据库的内容发生改变时,如何及时通知缓存,并更新缓存中的数据的问题。本节就介绍如何使用SQL Server 2005和.NET 2.0实现数据库的缓存依赖。
16.4.1 功能说明
SqlCacheDependency类的使用需要结合SQL Server 2005数据库,目前还没有Oracle数据库的缓存依赖。
16.4.2 语法定义
SqlCacheDependency类的使用语法如下:
public class SqlCacheDependency : IDisposable
其中继承了接口“IDisposable”,此接口主要用来定义释放分配的非托管资源的方法。继承此接口必须实现方法Dispose,用来实现资源的释放。
SqlCacheDependency类主要的构造函数如下:
public SqlCacheDependency(string database,string table)
其中参数一代表要启用缓存的数据库,参数二表示缓存的表。在实际使用过程中,只需要指明缓存的数据库和表即可。
16.4.3 方法和属性
SqlCacheDependency类的方法和属性同CacheDependency类相同,主要有三个。
—
—
—
这三个成员的使用方法同CacheDependency类的成员相似,本节不再赘述。
在下节要介绍的使用实例中,将不再使用代码的方式实现缓存依赖,而是使用“OutputCache”在.NET 2.0中提供的SqlCacheDependency参数实现数据库表的缓存。如果要使用编程的方式实现此功能,可参考CacheDependency类的实例。
16.4.4 使用SqlCacheDependency类的操作流程
要实现数据库缓存依赖,必须结合数据库的操作。在使用数据库缓存依赖前,必须进行5步操作。详细流程如图16-6所示。
只有具备了上述条件,才可以正常地使用数据库缓存依赖。下一节将结合这5步操作演示如何实现数据库的缓存依赖。
|
图16-6
16.4.5 典型应用:获取数据库表最新数据的实例
本例要实现的功能是当数据库的内容发生变化时,保存在缓存中的数据项被更新。具体演示的步骤如下所述。
表16-3
字 |
字段类型 |
说 |
id |
int |
自增长数据标识 |
Name |
nvarchar(20) |
书名 |
bookPublish |
nvarchar(50) |
出版社 |
Price |
decimal(6,2) |
书的价格 |
aspnet_regsql.exe -S
注意如果使用的数据库验证方式是“SQL Server身份验证”,则需要使用如下的启动命令:
aspnet_regsql.exe -S
Data.SqlClient"/>
图16-7
<caching>
</caching>
Literal1.Text = DateTime.Now.ToString();
注意:Duration参数是表示缓存的过期时间,单位是毫秒。
16.5 Session和Cache的区别
以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application。其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息。Session则保存对话信息。Application则是保存在整个应用程序范围内的信息,相当于全局变量。通常使用最频繁的是Session,那么Session和Cache又有什么区别呢?
本节结合使用经验,详细介绍Session缓存和Cache缓存的区别。
(1)最大的区别是Cache提供缓存依赖来更新数据,而Session只能依靠定义的缓存时间来判断缓存数据是否有效。
(2)即使应用程序终止,只要Cache.Add方法中定义的缓存时间未过期,下次开启应用程序时,缓存的数据依然存在。而Session缓存只是存在于一次会话中,会话结束后,数据也就失效了。
(3)Session容易丢失,导致数据的不确定性,而Cache不会出现这种情况。
(4)由于Session是每次会话就被加载,所以不适宜存放大量信息,否则会导致服务器的性能降低。而Cache则主要用来保存大容量信息,如数据库中的多个表。
(5)VS2005的测试版提供了将缓存保存在硬盘上的参数,但正式版中取消了这个功能,估计其在以后版本中会重新实现。而Session目前只能保存在内存中,对其性能有影响。
为了提高Cache的有效利用率,建议对于不经常改动的数据使用Cache。
16.6 小结
本章主要介绍了如何使用System.Web.Caching命名空间下的类,主要包括以下三个:Cache, CacheDependency和SqlCacheDependency。Cache类主要用来创建缓存项,主要针对的是数据不经常改变,但又使用频繁的数据表或文件。另两个类是.NET 2.0新添加的缓存依赖服务。通过文件依赖或数据库依赖,可以实现缓存数据的及时更新。
通过本章的学习,希望可以提高读者编写的网站的数据读取速度,节约带宽,为Web 2.0时代的到来打下坚实的基础。