zoukankan      html  css  js  c++  java
  • 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;
                }
            }


    }

  • 相关阅读:
    IOC+AOP
    基础知识
    断点续传
    监听程序
    Action、View、ActionResult、ViewResult、ContentResult
    json的使用(JObect,JsonData,JArray)
    get/post 接口调用
    常见的加密和解密
    WebUtility(提供在处理 Web 请求时用于编码和解码 URL 的方法。)
    MyBatis动态SQL和缓存
  • 原文地址:https://www.cnblogs.com/tangself/p/2159433.html
Copyright © 2011-2022 走看看