深入System.Web.Caching命名空间 教你Hold住缓存管理(三)
本文分三篇,从缓存所在命名空间System.Web.Caching开始,详细的介绍.NET框架提供的缓存类和操作方法。看完之后你将学会:
- 第一篇-如何实现简单的数据缓存
- 第二篇-缓存从文件中读取的数据,并通过文件依赖实现缓存数据的及时更新
- 第三篇-缓存数据库中的整张表,并通过数据库依赖实现缓存数据的及时更新
在学习了前两篇Cache类和CacheDependency类的用法后,最后一篇,我们来玩一下SqlCacheDependency类实现数据库缓存的及时更新。
如果对缓存管理没有基础的看官,建议看完前两篇再来看这一篇。
一,数据库缓存依赖类SqlCacheDependency
SqlCacheDependency类的使用需要结合SQL Server数据库,目前还没有Oracle数据库的缓存依赖。此篇我们使用SQL Server2005来演示。
1.语法定义
SqlCacheDependency类的语法定义如下:
public class SqlCacheDependency: IDisposable
同CacheDependency类一样,SqlCacheDependency也继承了接口”IDisposable“,此接口主要用来定义释放分配的非托管资源的方法。
继承此接口的类,必须实现方法Dispone ,实现资源的释放。这个接口在第二篇中有稍作介绍,在此不再复述了。
SqlCacheDependency的主要构造函数如下:
public SqlCacheDependency(string dataBase,string table)
dataBase代表要启用的缓存的数据库,table代表缓存的表。实际使用过程中,只需要指明缓存的数据和表就可以了。
2.方法和属性
SqlCacheDependency类的方法和属性与CacheDependency类相同,主要还是那三个:
- 属性”HasChanged“:判断数据库依赖是否发生了变化。
- 属性”UtcLastModified“:获取数据库缓存依赖项上次更改的事件。
- 方法”Dispose“:释放SqlCacheDependency对象占用的资源。
这三个成员的使用方法同CacheDependency类的成员相似,所以在此不再赘述。有需要的话可以在参考第二篇。
二,使用SqlCacheDependency类的流程
实现数据库缓存依赖,我所知的方法有两种,一种是使用编程的方法来实现,与第二篇中的实现文件缓存依赖的思路相似,不过创建缓存时依赖项是SqlCacheDependency的一个实例。
所以这里我想介绍给大家的是OutputCache缓存技术。如果想使用编程方式来实现此功能,可参考第二篇中最后的示例。
要实现数据库缓存依赖,必须结合数据库的操作。在使用数据库缓存依赖之前,必须进行5步操作:
只有具备了上述条件,才可以正常的使用数据库缓存依赖。最后我们看看如何来实现。
三,典型应用:使用SqlCacheDependency获取数据库表最新数据
这个示例所体现的功能是,缓存数据库表,并在内容发生变化时,保存在缓存中的数据项更新到最新。
1,创建数据库并为
我们首先创建一个数据库JohnConnor_DB,然后在数据库中添加一个Player表:
- id <int> 自增长数据标识,
- Name <nvarchar(20)> 球员姓名,
- Height<nvarchar(10)> 球员身高
2,通知数据库启用缓存依赖项
SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。
现在我们来为数据库启用缓存通知。这里有两种方式来通知数据库,表启用缓存依赖项,
- 借用ASPNET_REGSQL命令行工具
- 使用SqlCacheDependencyAdmin类
首先我们来介绍使用命令行工具,该工具位于windows\microsoft.net\framework\[版本]文件夹中。如果你找不到它,在安装VS2005以上版本的前提下,
可以点击 开始/所有程序/MicroSoft Visual Studio 2010/Visual Studio Tools/Visual Studio 2010命令提示来使用它,在命令提示框中输入
aspnet_regsql.exe -S 192.168.1.99\sqlserver2005 -U (JohnConnor),-P (JohnConnorV5) -ed -d JohnConnor_DB -et -t Player
注意如果使用的数据库验证方式是"Sql Server身份验证",则需要-E换成,
如果你想了解上面每个命令参数的意义,可以输入aspnet_regsql.exe -? 这里为了方便大家理解给了个参数列表(列表是COPY来的,原谅我的懒惰,阿门~~~)
- -S 后接的参数为数据库服务器的名称或者IP地址;
- -U 后接的参数为数据库的登陆用户名;
- -P 后接的参数为数据库的登陆密码;
- -E 使用当前登录用户的 Windows 集成认证进行身份验证。
- -d 后接参数为对哪一个数据库采用SqlCacheDependency功能;
- -C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。
- -t 后接参数为对哪一个表采用SqlCacheDependency功能;
- -ed 允许对数据库使用SqlCacheDependency功能;
- -dd 禁止对数据库采用SqlCacheDependency功能;
- -et 允许对数据表采用SqlCacheDependency功能;
- -dt 禁止对数据表采用SqlCacheDependency功能;
- -lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。
输入命令后,回车,执行成功,会提示为SQL缓存依赖项启用该数据库/表。
第二个方法使用SqlCacheDependencyAdmin类,直接在页面的“Page_Load”下加入以下注册代码
protected void Page_Load(object sender, EventArgs e) {
System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(
System.Configuration.ConfigurationManager.ConnectionStrings["name"].ConnectionString);//通知哪个数据库,name是该数据库链接字符串的名字 System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(
System.Configuration.ConfigurationManager.ConnectionStrings["name"].ConnectionString, "Player");//通知启用哪个表,Player是表名 }
就可以了。
两种方法执行后,会向数据库里添加一个AspNet_SqlCacheTablesForChangeNotification表。
3,在网站中进行数据库缓存项配置
然后我们新建一个ASP.NET网站(我偷懒,第二篇的改个名字继续用...),命名为JohnConnor.SqlCacheDependencySample。
首先我们在Web.Config中配置数据库链接字符串:
<connectionStrings> <add name="TestDBconnectionStrings" providerName="System.Data.SqlClient"
connectionString="Data Source=192.168.1.99\SQLSERVER2005;Initial Catalog=JohnConnor_DB;User ID=JohnConnor;Password=JohnConnorV5;" /> </connectionStrings>
然后在“system.web”节点内,添加数据库缓存依赖的配置,注意配置中的“connectionStringsName”属性,需要与前面创建的数据库链接字符串名字对应:
<caching> <sqlCacheDependency enabled="true" pollTime="1000"> <databases> <add name="JohnConnor_DB" connectionStringName="TestDBconnectionStrings" pollTime="1000"/> </databases> </sqlCacheDependency> </caching>
现在我们的配置部份就暂时告一段落。下面我们来验收成果。
4. 完成示例
我们在默认生成的Default.aspx页,添加一个GridView控件,用来显示从数据库获取的数据。并添加一个控件,主要用来显示时间,用时间来判断页面显示的是否是缓存数据。
首先给GridView配置数据源,单击任务列表,在“选择数据源”下拉框中,单击“新建数据源”,在配置向导的数据源类型窗口中选择“数据库”,单击“确定”后出现选择链接字符串窗口,在下拉列表中选择我们刚才创建的”TestDBconnectionStrings“连接串,单击”下一步“,出现“配置Select语句”对话框,在“列”列表框中选择“*”,表示选中所有列,”下一步“,“完成”。
现在切换到代码视图,在"Page_Load"事件中添加:
Literal.Test=DateTime.Now.ToString();
主要是来判断显示的是不是缓存。现在保存下F5,刷新页面可以看到时间是不断变化的,说明数据并非来自缓存。
现在在Default.aspx的源代码视图的"<@page>"行下,添加如下代码:
<%@ OutputCache Duration="3600" SqlDependency="JohnConnor_DB:Player" VaryByParam="none"%>
这样数据库缓存依赖就添加完成了。
现在F5运行网站,此时再刷新页面,发现时间已经不再变化,因为整个页的数据都被缓存了。
现在我们修改以下数据库的内容,然后刷新刚才的页面,可以发现,时间向后推进了,数据也发生了改变。
这就是数据库缓存依赖的作用了。
当数据库内容更新的时候,不管缓存的时间是否到了,缓存内容都会被更新。
----------------------------------------------------------END------------------------------------------------------
草草结了个尾。。。
至此,三篇已经完结。这是一个完结的短篇幅系列,,,不容易呢。比较忙丫,没时间写长篇。
谢谢大家捧场。希望能够帮助到有用的人