这两天 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的缓存管理类图

   XML 1
它使用了不少的设计情势,例如工厂形式,Factory方式等。但是他的安插性也是特其余不灵活,比如说增加一个缓存项,也急需去修改许多地方的代码,例如DependencyAccess,微软在店堂类库中有一个基本组件ObjectBuilder,7个月前从未有过尖锐学习,就发了一个如此的稿子MS
的IOC容器(ObjectBuilder)?

。上面的事例中自己利用ObjectBuilder进行改造,也就是IoC格局开展改建,如今我们对IOC的出众(Castle)的钻研也足够多。
   
具体的代码我就不讲了.代码格外的简练,有多个着力的单元测试,可以团结下载了钻探一下,有如何难点这里一起互换。我上面将安排文件和PetShop4的布局文件作个比较。
PetShop4的配备文件
<appSettings>
  
  <!– Enable data caching –>
  <add key=”EnableCaching” value=”true”/>
XML,  <!– 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

相关文章

网站地图xml地图