数据库缓存依赖

时间:2022-09-22 04:44:34

1 web.config配置如下;
    <caching>
      <!--enabled指示是否轮询更改。pollTime此值对应于连续两次轮询之间的毫秒数。不能设置为小于 500 毫秒的值。默认值为 1 分钟。-->
      <sqlCacheDependency enabled="true" pollTime="60000">
        <databases>
          <add name="EduPortalCache" connectionStringName="EduPortalConn" />
        </databases>
      </sqlCacheDependency>
    </caching>
      <connectionStrings>
    <add name="EduPortalConn" connectionString="User ID=sa;Initial Catalog=Portal;Data Source=localhost;Password=1111"  providerName="System.Data.SqlClient" />
  </connectionStrings>

2 打开 Visual Studio 2008 命令提示 执行如下命令:
aspnet_regsql -C "User ID=sa;Initial Catalog=Portal;Data Source=localhost;Password=1111" -ed -et -t "SSOPortal_PublishNewTrends"

aspnet_regsql -C "User ID=sa;Initial Catalog=Portal;Data Source=localhost;Password=1111" -ed -et -t "SSOPortal_PublishRecommendation"
查看那些表使用了缓存依赖
aspnet_regsql -C "User ID=sa;Initial Catalog=Portal;Data Source=localhost;Password=1111" –lt

 

3 代码如下:

        /// <summary>
        /// 获取当前应用程序指定CacheKey的Cache对象值
        /// </summary>
        /// <param name="CacheKey">索引键值</param>
        /// <returns>返回缓存对象</returns>

        public static object GetCache(string CacheKey)
        {

            System.Web.Caching.Cache objCache = HttpRuntime.Cache;

            return objCache[CacheKey];

        }

        /// <summary>
        /// 设置以缓存依赖的方式缓存数据
        /// </summary>
        /// <param name="CacheKey">索引键值</param>
        /// <param name="objObject">缓存对象</param>
        /// <param name="cacheDepen">依赖对象</param>
        public static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep)
        {

            System.Web.Caching.Cache objCache = HttpRuntime.Cache;

            objCache.Insert(

                CacheKey,

                objObject,

                dep,

                System.Web.Caching.Cache.NoAbsoluteExpiration,//从不过期

                System.Web.Caching.Cache.NoSlidingExpiration,//禁用可调过期

                System.Web.Caching.CacheItemPriority.Default,

                null);
        }
        /// <summary>
        /// 绑定最新动态
        /// </summary>
        private void BindNews()
        {
            //EduPortal.BLL.SSOPortal_PublishNewTrends bll = new EduPortal.BLL.SSOPortal_PublishNewTrends();
            //DataSet ds = bll.GetList(8, "", "OrdID DESC");
            //repNews.DataSource = ds.Tables[0];

            string CacheKey = "SSONEWS";

            object objModel = CommonHelper.GetCache(CacheKey);//从缓存中获取

            if (objModel == null)//缓存里没有
            {
                objModel = GetNews();//从数据库中获取

                if (objModel != null)
                {
                    //依赖数据库SSOPortal_PublishNewTrends表变化 来更新缓存
                    System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("EduPortalCache", "SSOPortal_PublishNewTrends");

                    CommonHelper.SetCache(CacheKey, objModel, dep);//写入缓存
                }
            }

            repNews.DataSource = (DataTable)objModel;
            repNews.DataBind();
        }

        /// <summary>
        /// 获取最新动态
        /// </summary>
        /// <returns></returns>
        private DataTable GetNews()
        {
            DataTable dt = null;

            try
            {
                EduPortal.BLL.SSOPortal_PublishNewTrends bll = new EduPortal.BLL.SSOPortal_PublishNewTrends();
                DataSet ds = bll.GetList(8, "", "OrdID DESC");

                if (ds != null && ds.Tables[0].Rows.Count > 0)
                {
                    dt = ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("操作类型:{0} 操作内容:{1} 操作用户:{2} 客户端IP:{3} 操作时间:{4} ", "最新动态", "最新动态-异常信息:" + ex.Message.ToString(), "", CommonHelper.GetIPAddress(), DateTime.Now.ToLocalTime()));
            }

            return dt;
        }

 

4 参考文章

http://www.cnblogs.com/ltp/archive/2009/06/30/1514331.html