深入System.Web.Caching命名空间 教你Hold住缓存管理

Posted Baymax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入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------------------------------------------------------

  草草结了个尾。。。

  至此,三篇已经完结。这是一个完结的短篇幅系列,,,不容易呢。比较忙丫,没时间写长篇。

  谢谢大家捧场。希望能够帮助到有用的人

以上是关于深入System.Web.Caching命名空间 教你Hold住缓存管理的主要内容,如果未能解决你的问题,请参考以下文章

深入System.Web.Caching命名空间 教你Hold住缓存管理

System.Web.Caching

C# System.Runtime.Caching使用

System.Web.Caching

System.Web.Caching.Cache类 缓存 各种缓存依赖

缓存-System.Web.Caching.Cache