再努力一点点

没有烟抽的日子
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

为微软企业库缓存块添加SqlDependency

Posted on 2010-05-30 15:42  ZhangPeng.Chen  阅读(904)  评论(0)    收藏  举报

微软企业库缓存块中并没有提供像System.Web.Caching下的SqlCacheDependency
那我们就为它添加一个吧。

我们可以直接包接System.Web.Caching的SqlCacheDependency

public class SqlDependency : ICacheItemExpiration
{
    
private SqlCacheDependency _sqlCacheDependency;

    
public SqlDependency(string databaseEntryName, string tableName) 
    {
        _sqlCacheDependency 
= new SqlCacheDependency(databaseEntryName, tableName);
    }

    
#region ICacheItemExpiration Members

    
public bool HasExpired()
    {
        
return _sqlCacheDependency.HasChanged;
    }

    
public void Initialize(CacheItem owningCacheItem)
    { }
 
    
public void Notify()
    { }
 
    
#endregion
}


并在web.config中添加如下配置
    <system.web>
      <caching>
        <sqlCacheDependency enabled="true" pollTime="1000"> // pollTime设置为1秒,仅仅为了测试,希望马上看到效果
          <databases>
            <add name="DatabaseName" connectionStringName="DatabaseName" />
          </databases>
        </sqlCacheDependency>
      </caching>
    </system.web>

我们需要开启数据库的MSSQL缓存通知功能,使用工具老是会让人忘记,呼,记忆力不好啊。
System.Web.Caching中提供了一个类SqlCacheDependencyAdmin,可以提供我们管理功能。

string connectionString = "..."
string tableName = "..."
SqlCacheDependencyAdmin.EnableNotifications(connectionString); // 开启数据库的Sql缓存通知功能
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, tableName); // 开启数据库某表的Sql缓存通知

不过此方法依赖性太强,依赖于MS SqlServer数据库,并且需要每间隔poolTime的时候就去轮询数据库中的AspNet_SqlCacheTablesForChangeNotification表,去查看表数据是否更改。

-------------------------------------------------------------------
如果不用SqlDependency,有什么方法可以有效的移除缓存呢?

表1: 添加缓存Key1,添加缓存Key2...
表2: 添加缓存Key3
表3:添加缓存Key4, 添加缓存Key5, 添加缓存Key6...

表1更改时,移除Key1, Key2
表2更改时,移除Key3
表3更改时,移除Key4, Key5, Key6
-------------------------------------------------------------------- 这种原始方法绝对可以满足要求
缺点:我们严重依赖缓存键值,如果添加缓存的位置键值发生更改,我们也需要到移除缓存的位置去更改。

我们可以使用分组
表1: 添加缓存Key1,添加缓存Key2..., group1
表2: 添加缓存Key3, group2
表3:添加缓存Key4, 添加缓存Key5, 添加缓存Key6..., group3

表1更改时,移除group1
表2更改时,移除group2
表3更改时,移除group3

效果非常好。