ASP.NET SqlCacheDependency 使用笔记

 

使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀),

例如:select * from table1select column1 from table1select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。


使用步骤

一 为数据库开启SqlCacheDependency功能

方法1:使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库。

aspnet_regsql -S SQL服务器名 -E -d 数据库 -ed      启动数据库的数据缓存依赖功能

我们还需要对相关的数据表执行aspnet_regsql命令,如:
aspnet_regsql -S SQL服务器名 -E -d 数据库 -t 表名 -et 多个表就多次执行这句话

方法2:

SqlCacheDependencyAdmin.EnableNotifications(connectionString);      //启动数据库的数据缓存依赖功能                    

SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, table);         //启用数据表缓存

推荐这段代码写在Global.asaxApplication_Start方法中,以便应用程序启动的时候就启用数据库和数据表的缓存依赖功能。

二 配置Web.config

<!--缓存配置-->
      <caching>
      <!--pollTime为查询数据库是否变动的间隔时间,毫秒单位-->
          <sqlCacheDependency enabled="true" pollTime="10000">
              <databases>
                  <add name="数据库名" connectionStringName="Webconfig的连接字符串key" pollTime="10000"/>
              </databases>
          </sqlCacheDependency>
      </caching>

三 编码实现

缓存操作类:

        /// <summary>
        /// 获取所有相关配置并对应添加CacheDependency对象
        /// </summary>
        /// <param name="configKey">指定需要使用Cache的数据库表名的Webconfig's key</param>
        /// <returns></returns>

        public static AggregateCacheDependency GetDepandency(string configKey)
        {
            AggregateCacheDependency dependency = new AggregateCacheDependency();
            string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
            string tableConfig = ConfigurationManager.AppSettings[configKey];
            string[] tables = tableConfig.Split(',');
            foreach (string tableName in tables)
                dependency.Add(new SqlCacheDependency(dbName, tableName));
            return dependency;
        }

缓存业务类:

    /// <summary>
    /// 友情链接SqlCacheDependency类
    /// </summary>

    public class LinksProxy
    {
        /// <summary>
        /// 设置缓存持续时间
        /// </summary>

        private static readonly int CacheTimeout = int.Parse(ConfigurationManager.AppSettings["LinksCacheDuration"]);
        /// <summary>
        /// 是否开启缓存
        /// </summary>

        private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);

        /// <summary>
        /// 获取全部友情链接
        /// </summary>

        public static IList<LinksInfo> GetLinks()
        {
            //如果不开启缓存则直接调用DAL方法执行常规操作
            if (!enableCaching)
                return LinksDAL.SelectLinks();
            else //开启缓存
            {
                //设置缓存key,这个最好根据查询条件来设置,这样可以缓存同一条件的数据
                string key = "Links_by_search_all";
                //读取缓存中的数据
                IList<LinksInfo> data = (IList<LinksInfo>)HttpRuntime.Cache[key];
                if (data == null)//如果缓存没有读到数据
                {
                    //访问DAL从数据库读取数据并加入缓存,最后返回
                    data = LinksDAL.SelectLinks();
                    AggregateCacheDependency acd = TableCacheDependency.GetDepandency("LinksTableDependency");
                    HttpRuntime.Cache.Add(key, data, acd,DateTime.Now.AddMinutes(CacheTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
                }
                return data;
            }
        }


}

你可能感兴趣的:(dependency)