AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的缓存管理和使用ObjectBuil

       这两天 PetShop is Evil?等对PetShop 的讨论很多,我在这里也发一篇凑凑热闹。我下面主要是对Asp.net 2.0新增的缓存管理方面的内容和PetShop 4的缓存处理的一个认识,大家一起来学习,交流才能进步,欢迎拍砖头。

      Asp.net 2.0新增的缓存管理       CacheDependency跟踪缓存依赖项,缓存依赖项可以是应用程序的 Cache 中的文件、目录或与其他对象的键。

   SqlCacheDependency类在所有受支持的 SQL Server 版本 (7.0, 2000, 2005) 上监视特定的 SQL Server 数据库表,以便在该表发生更改时,自动从 Cache 中删除与该表关联的项。 数据库表发生更改时,将自动删除缓存项,并向 Cache 中添加新版本的项。在使用 SQL Server 2005 数据库时,SqlCacheDependency 类还支持与 System.Data.SqlClient.SqlDependency 类进行集成。使用 SQL Server 2005 的查询通知机制来检测使 SQL 查询结果无效的数据更改。与 SQL 查询关联的任何缓存项都将从 System.Web.Caching.Cache 中移除。在使用 SQL Server 2005 时,可以使用 SqlCacheDependency 类向应用程序的 Cache 添加依赖于 SQL Server 数据库表或 SQL 查询的项

   AggregateCacheDependency 类监视依赖项对象的集合,以便在任何依赖项对象更改时,该缓存项都会自动移除。数组中的对象可以是 CacheDependency 对象、SqlCacheDependency 对象、从 CacheDependency 派生的自定义对象或这些对象的任意组合.

AggregateCacheDependency 类与 CacheDependency 类的不同之处在于前者允许您将不同类型的多个依赖项与单个缓存项关联。例如,如果您创建一个从 SQL Server 数据库表和 XML 文件导入数据的页,则可创建一个 SqlCacheDependency 对象来表示数据库表的依赖项,以及一个 CacheDependency 来表XML 文件的依赖项。可创建 AggregateCacheDependency 类的一个实例,将每个依赖项添加到该类中,而不是为每个依赖项调用 Cache.Insert 方法。然后,可使用单个Insert 调用使该页依赖于 AggregateCacheDependency 实例。

ASP.NET 2.0 允许您使用 SqlCacheDependency 类创建依赖于数据库中表或行的缓存项。当表中或特定行中发生更改时,带有依赖项的项便会失效,并会从缓存中移除。可以在 Microsoft SQL Server 7.0、SQL Server 2000 和 SQL Server 2005 中设置表的依赖项。如果您使用 SQL Server 2005,还可以设置特定记录的依赖项。

ASP.NET 2.0 SQL 缓存依赖项提供以下功能:

1. SQL 缓存依赖项可用于应用程序缓存和页输出缓存。

2. 可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项。

3. 可以在网络园(一台服务器上存在多个处理器)或网络场(多台服务器运行同一应用程序)中使用 SQL 缓存依赖项。

4. 与 SQL 缓存依赖项关联的数据库操作比较简单,因此不会给服务器带来很高的处理成本。

ASP.NET 2.0 为 SQL Server 7.0 和 SQL Server 2000 的缓存依赖项实现了一个轮询模型。ASP.NET 进程内的一个线程会以指定的时间间隔轮询 SQL Server 数据库,以确定数据是否已更改。如果数据已更改,缓存依赖项便会失效,并从缓存中移除。可以在 Web.config 文件中以声明方式指定应用程序中的轮询间隔,也可以使用 SqlCacheDependency 类以编程方式指定此间隔。

对于 SQL Server 7.0 和 SQL Server 2000,SQL 缓存依赖项仅限于表级别的数据更改。可以将 ASP.NET 配置为轮询数据库来确定表中的更改,但不能确定特定行中的更改。

启用 SQL 缓存

为了在 SQL Server 7.0 和 SQL Server 2000 中使用 SQL 缓存依赖项,必须先将 SQL Server 配置为支持缓存依赖项。ASP.NET 提供了一些实用工具,可用于配置 SQL Server 上的 SQL 缓存,其中包括一个名为 Aspnet_regsql.exe 的工具和 SqlCacheDependencyAdmin 类.

SQL Server 2005 为缓存依赖项实现的模型不同于 SQL Server 7.0 和 SQL Server 2000 中的缓存依赖项模型。在 SQL Server 2005 中,不需要执行任何特殊的配置步骤来启用 SQL 缓存依赖项。此外,SQL Server 2005 还实现了一种更改通知模型,可以向订阅了通知的应用程序服务器发送通知,而不是依赖早期版本的 SQL Server 中必需的轮询模型。

SQL Server 2005 缓存依赖项在接收通知的更改类型方面更具灵活性。SQL Server 2005 监控对特定 SQL 命令的结果集的更改。如果数据库中发生了将修改该命令的结果集的更改,依赖项便会使缓存的项失效。此功能使得 SQL Server 2005 可以提供行级别的通知。

MS PetShop4.0对 缓存的管理

在PetShop中,需要对数据表实现Cache。这些Cache都存放在.Net为Web系统提供的Cache集合对象System.Web.Caching.AggregateCacheDependency中,下面代码中的红色标明的代码就是AggregateCacheDependency缓存管理的代码。

/// <summary>
 /// This is the base class for SQL2KCacheDependency implementation that encapsulates common
 /// algorithm to retrieve database and table names from configuration file and create
 /// the necessary AggregateCacheDependency object
 /// </summary>
 public abstract class TableDependency : PetShop.ICacheDependency.IPetShopCacheDependency {
 // This is the separator that's used in web.config
 protected char[] configurationSeparator = new char[] { ',' };
 protected AggregateCacheDependency dependency = new AggregateCacheDependency();
  /// <summary>
 /// The constructor retrieves all related configuration and add CacheDependency object accordingly
 /// </summary>
 /// <param name="configKey">Configuration key for specific derived class implementation</param>
  protected TableDependency(string configKey) {
 string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
 string tableConfig = ConfigurationManager.AppSettings[configKey];
 string[] tables = tableConfig.Split(configurationSeparator);
 foreach (string tableName in tables)
 dependency.Add(new SqlCacheDependency(dbName, tableName));
 }
 public AggregateCacheDependency GetDependency() {
 return dependency;
  }
}

下面这个图就是PetShop 4的缓存管理类图

它使用了众多的设计模式,例如工厂模式,Factory模式等。但是他的设计也是非常的不灵活,比如说增加一个缓存项,也需要去修改许多地方的代码,例如DependencyAccess,微软在企业类库中有一个核心组件ObjectBuilder,半年前没有深入学习,就发了一个这样的文章MS 的IOC容器(ObjectBuilder)? 。下面的例子中我使用ObjectBuilder进行改造,也就是IoC方式进行改造,最近大家对IOC的典型(Castle)的研究也非常多。     具体的代码我就不讲了.代码非常的简单,有两个基本的单元测试,可以自己下载了研究一下,有什么问题这里一起交流。我下面将配置文件和PetShop4的配置文件作个比较。 PetShop4的配置文件

<appSettings>
 
  <!-- Enable data caching -->
  <add key="EnableCaching" value="true"/>
  <!-- Cache duration (in hours-whole number only) -->
  <add key="CategoryCacheDuration" value="12"/>
  <add key="ProductCacheDuration" value="12"/>
  <add key="ItemCacheDuration" value="12"/>
  <!-- Cache dependency options. Possible values: PetShop.TableCacheDependency for SQL Server and keep empty for ORACLE -->
  <add key="CacheDependencyAssembly" value="PetShop.TableCacheDependency"/>
  <!-- CacheDatabaseName should match the name under caching section, when using TableCacheDependency -->
  <add key="CacheDatabaseName" value="MSPetShop4"/>
  <!-- *TableDependency lists table dependency for each instance separated by comma -->
  <add key="CategoryTableDependency" value="Category"/>
  <add key="ProductTableDependency" value="Product,Category"/>
  <add key="ItemTableDependency" value="Product,Category,Item"/>
  </appSettings>

改造后的配置文件

<configSections>
    <section name="AspCacheConfiguration"  type="AspCacheDependency.Configuration.AspCacheDependencySettings, AspCacheDependency" />
  </configSections>  

  <AspCacheConfiguration >
    <aspCacheProviders>
      <add name="Product" type="AspCacheDependency.AspSqlCacheDependency, AspCacheDependency" database="MSPetShop4" table="Product,Category"/>
      <add name="Category" type="AspCacheDependency.AspSqlCacheDependency, AspCacheDependency" database="MSPetShop4" table="Category"/>
    </aspCacheProviders>  
</AspCacheConfiguration>

改造后的缓存使用就非常的简单了,而且可以应用于任何的项目,而不会合特定的项目相关。具体例子例如下面单元测试代码:

        [TestMethod]
        public void GetAspSqlCacheDependencyCategory()
        {
            AspSqlCacheDependency sqlCachelDep = AspCacheDependencyFactory.CreateDependency("Category");
            Assert.AreEqual(sqlCachelDep.Table, "Category");
            AggregateCacheDependency dependency = sqlCachelDep.GetDependency();
            Assert.IsNotNull(dependency);
        }

代码下载:AsplCacheDependency.rar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏破晓之歌

Django框架中Mysql数据库连接 原

将settings.py文件中的Databases数据库连接部分设置如上,这里的USER和PASSWORD要和mysql里设置的一样,3306端口为默认,127...

12120
来自专栏LanceToBigData

MySQL(十五)之数据备份中mysqldump详解

前言   其实前面一篇数据备份已经是非常的详细了,这里我想单独的讲解一下mysqldump,相信很多程序员都是用过这个命令的! 一、MySQL数据库的备份与还原...

33580
来自专栏Danny的专栏

SQL Server 2008 附加数据库时出错

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

2.8K30
来自专栏喵了个咪的博客空间

基于PhalApi2的Redis拓展

基于PhalApi2的Redis拓展 ? 前言 Redis在PHP开发中运用场景已经无处不在,小到简单缓存大到数据库或消息队列都可以使用Redis来进行实现,基...

31750
来自专栏沈唁志

如何在CentOS 7上安装PostgreSQL关系数据库

PostgreSQL关系数据库系统是一个功能强大的,可扩展的,并符合标准的开源数据库平台。本指南将帮助您在CentOS 7 Linode上安装和配置Postgr...

18320
来自专栏杨建荣的学习笔记

MySQL备份恢复第二篇(r5笔记第6天)

MySQL中的数据恢复功能相比Oracle来说还是要单薄一些,而Oracle中的数据恢复相对来说自动化的程度要高一些。不过Mysql的二进制日志提供的信息很丰富...

36850
来自专栏程序员的SOD蜜

(PDF.NET框架实例讲解)将存储过程映射为实体类

PDF.NET数据开发框架可以将表,视图,表值函数,自定义的查询语句和存储过程映射为实体类,在上一篇《(PDF.NET框架实例讲解)将任意复杂的SQL查询映射成...

244100
来自专栏无题

分布式锁通用解决方案

分布式锁的解决方式: 基于数据库: 基于数据库表做乐观锁,用于分布式锁。(version) 基于数据库表做悲观锁(InnoDB,for upda...

1.7K60
来自专栏Java帮帮-微信公众号-技术文章全总结

Quartz数据库表分析【面试+工作】

共11张表,前6张都是关于各种triggers的信息,后面包括job,悲观锁,调度状态等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在S...

22740
来自专栏ytkah

dedecms批量修改文章为待审核稿件怎么操作

  dedecms批量修改文章为待审核稿件要怎么操作呢?因为我们有时会出于某些原因要把文章暂时先隐藏掉,dedecms有一个比较好的功能是将文件状态设为未审核前...

31550

扫码关注云+社区

领取腾讯云代金券