• 深入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------------------------------------------------------

      草草结了个尾。。。

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

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

  • 相关阅读:
    关于同余最短路
    【水】关于 __attribute__
    题解【AtCoder
    一些简单图论问题
    浅谈简单动态规划
    关于博客园主题(美化博客园)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第47章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第46章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第45章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第44章 读书笔记(待更新)
  • 原文地址:https://www.cnblogs.com/liaods/p/9940413.html
Copyright © 2020-2023  润新知