zoukankan      html  css  js  c++  java
  • 深入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类

       首先我们来介绍使用命令行工具,该工具位于windowsmicrosoft.netframework[版本]文件夹中。如果你找不到它,在安装VS2005以上版本的前提下,

      可以点击 开始/所有程序/MicroSoft Visual Studio 2010/Visual Studio Tools/Visual Studio 2010命令提示来使用它,在命令提示框中输入

    aspnet_regsql.exe -S 192.168.1.99sqlserver2005 -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.99SQLSERVER2005;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------------------------------------------------------

      草草结了个尾。。。

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

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

  • 相关阅读:
    mysql数据库安装,启动和关闭
    python学习笔记(xlsxwriter模块使用)
    redis集群搭建
    gpasswd 命令详解
    linux CPU使用率过高或负载过高的处理思路
    Django模型(ORM)
    Django模板层(template)
    Windows下安装node.js(npm) git+vue
    Sublime Text 3:3114的安装(目前最新),插件emmet的安装
    opacity在IE6~8下无效果,解决的办法
  • 原文地址:https://www.cnblogs.com/liaods/p/9940413.html
Copyright © 2011-2022 走看看