幸运星空

Lucker的程序人生

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

数据层的个性配置

可以很容易就知道,在Pet Shop 4中,客户个性配置的功能也是采用了工厂模式设计,故其结构和思路跟DAL中的数据访问功能很相似.

实现个性配置相关的文件如下表:

项目名称 文件名称 类(接口)名称 说明
ProfileDALFactory     工厂
  DataAccess.cs DataAccess 根据Web.congif文件中ProfileDAL结点中的profile项目决定实例化哪个类来完成个性化配置功能
IProfileDAL     接口
  IPetShopProfileProvider.cs IPetShopProfileProvider 提供个性化配置要用到的全部方法的定义
SQLProfileDAL      
  PetShopProfileProvider.cs PetShopProfileProvider 针对SQLServer数据库,继承自IPetShopProfileProvider接口,实现其全部方法
OracleProfileDAL      
  PetShopProfileProvider.cs PetShopProfileProvider 针对Oracle数据库,继承自IPetShopProfileProvider接口,实现其全部方法
Profile     不明其具体功能(有待进一步研究)
  PetShopProfileProvider.cs PetShopProfileProvider* 不知道该类和上面几个类(接口)有什么关系
XXXX     XXXX
  XXXX ProfileProvider* Profile项目中的PetShopProfileProvider类继承处该类,但目前不知该类的出处,对访类一无所知

注:以上*号标注部分有待进一步研究,如有熟知的朋友,谢谢告诉我一声.

数据层的缓存依赖

缓存依赖,是当用户本地缓存的数据在数据库(服务器)端发生变化时,数据库能够通知用户本地缓存,使得本得缓存能够重新读取新的数据到缓存中,实现缓存数据和数据库实际数据的同步,可以大大提高数据库访问的性能.

值得注意的是:PetShop4中只提供了SQLServer的数据缓存处理类:SqlCacheDependency类.

这里的缓存依赖同样采用了工厂模式.

项目名称 文件名称 类(接口)名称 说明
ICacheDependency     缓存依赖的接口
  IPetShopCacheDependency.cs IPetSpopCacheDependency 创建缓存实例,返回一个AggregateCacheDependency类,用来监控依赖项,如果依赖项对象发生了改变,则移除缓存Cache中的此对象,并读取新的缓存版本.
TableCacheDependency     缓存依赖的实现
  TableDependency.cs TableDependency 通过Web.config文件中的CacheDatabaseName和configKey,判断要缓存的数据库和键值(表),并添加到缓存中.
  Product.cs,Item.cs,Category.cs Product,Item,Category 继承自TableDependency类,为父类提供数据库的表名称的参数.
CacheDependencyFactory     工厂
  DependencyAccess.cs DependencyAccess 通过判断Web.config文件中的CacheDependencyAssembly项目,返回缓存实例
  DependencyFacade.cs DependencyFacade 采用外观设计模式,该类是用户真正调用的类,用于包装复杂的调用,它只提供几个简单的GetCategoryDependency(),GetProductDependency(),GetItemDependency()方法,来调用DependencyAccess类

缓存依赖的实现机制

要实现缓存依赖,必须知道两大要素:一上DBMS如何知道哪个数据库需要缓存依赖,二是应用程序如何知道哪个数据库和表有缓存了.

解决第一个问题的方法是:在DBMS上注册数据库的缓存依赖.通过数据库注册工具aspnet_regsql来实现注册,在命令行状态下:

aspnet_regsql -S localhost -U mspetshop -P pass@word1 -d MSPetShop4 -et -t Catagory

各参数的说明如下表:

参数名称 说明
-S 服务器名称
-U 登录名
-P 登录用户密码
-E 使用Windows验证
-t 对哪个表采用缓存依赖
-d 对哪个数据库采用缓存依赖
-ed 允许对数据使用缓存依赖
-dd 禁止对用户使用缓存依赖
-et 允许对某表使用缓存依赖
-dt 禁止对某表使用缓存依赖
-lt 列出使用使用缓存依赖的表

PetShop4中,数据库MSPetShop4中表AspNet_SqlCacheTableForChangeNotification就是保存缓存依赖表的.表内容如下图:

image

当表的内容发生变化时,相关的存储过程和触发器就让changeId自动加1,并修改缓存表和获取缓存表的信息.相关的存储过程如下表:

存储过程名称 说明
AspNet_SqlCachePollingStoredProcedure 通知应用程序哪个表发生了变化
AspNet_SqlCacheQueryRegisteredTablesStoredProcedure 查询注册过的缓存依赖表
AspNet_SqlCacheRegisterTableStoredProcedure 注册缓存表,并为缓存表添加触发器,以获取缓存表的变化
AspNet_SqlCacheUnRegisterTableStoredProcedure 去除表的缓存依赖
AspNet_SqlCacheUpdateChangeIdStoredProcedure 当表的数据变化时,让changeId自动加1

由上表可以得知,解决第一个问题的方法是:通过存储过程AspNet_SqlCachePollingStoredProcedure来通知,当然其中用到了触发器,以实现自动通知.

整个缓存注册的过程可以表示成下面的形式:

注册数据库缓存依赖->在数据库中自动添加缓存表->自动添加存储过程->存储过程添加触发器->通过触发器通知哪个表发生了变化->更新changeId.

另外还必须在Web.config中配置:

image

posted on 2008-12-18 12:48  Lucker  阅读(640)  评论(0编辑  收藏  举报