AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的缓存管理和运用ObjectBuilder改造PetShop4 的缓存示例

       这两天 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];

SQL Server,            string[] tables =
tableConfig.Split(configurationSeparator);

 

            foreach (string tableName in tables)

                dependency.Add(new SqlCacheDependency(dbName,
tableName));

        }

 

        public AggregateCacheDependency GetDependency()
{

            return dependency;

        }

}

下边这么些图就是PetShop 4的缓存管理类图

   SQL Server 1
它利用了无数的设计格局,例如工厂格局,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

相关文章