SQL数据库缓存

们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。 

  答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。 

  实现步骤: 

  下面就让我们看一下如何实现数据库缓存依赖功能:

  第一步: 修改web.config,让项目启用SqlCacheDependency 

  将下列代码加入web.config<system.web>节:    

<system.web>
    <!--配置缓存依赖-->
    <caching>
      <sqlCacheDependency enabled="true" pollTime="6000">
        <databases>
          <add name="MyWebSite" connectionStringName="MyWebSiteConnectionString"/>
        </databases>
      </sqlCacheDependency>
    </caching>
<connectionStrings>
<span style="white-space:pre">		</span><add name="MyWebSiteConnectionString" connectionString="Data Source=XP-201107030245\SQLEXPRESS;Initial Catalog=MyWebSite;Integrated Security=True" providerName="System.Data.SqlClient"/>
<span style="white-space:pre">	</span></connectionStrings>
注意:在<databases>节的<add name="MyWebSite" connectionStringName="MyWebSiteConnectionString"/>中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("MyWebSite","ProductData"); 中的第一个参数(数据库名称)相一致。


第二步:执行下述命令,为 数据库启用缓存依赖。

  如果要配置SqlCacheDependency,则需要以命令行的方式执行。

  aspnet_regsql.exe工具位于Windows\\Microsoft.NET\\Framework\\[版本]文件夹中。

  aspnet_regsql -C "Data Source=XP-201107030245\SQLEXPRESS;Initial Catalog=MyWebSite;Integrated Security=True" providerName="System.Data.SqlClient"/>" -ed -et -t "ProductData"

  参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

  参数-t后面的字符串是数据表的名字。

  运行结果如图 所示:


命令执行后,在指定的数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表.

 第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖: 

namespace WebDBCache
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string CacheKey = "cachetest";

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

            if (objModel == null)//缓存里没有
            {

                objModel = GetData();//把当前时间进行缓存

                if (objModel != null)
                {

                    //依赖数据库codematic中的P_Product表变化 来更新缓存

                    System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("MyWebSite", "ProductData");

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

                }
            }
            GV.DataSource = (DataSet)objModel;

            GV.DataBind();
        }

        private DataSet GetData()
        {

            string conString = "Data Source=XP-201107030245\\SQLEXPRESS;Initial Catalog=MyWebSite;Integrated Security=True";

            string strSQL = "SELECT * FROM ProductData";

            SqlConnection myConnection = new SqlConnection(conString);

            DataSet ds = new DataSet();

            myConnection.Open();

            SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection);

            adapter.Fill(ds, "Product");

            myConnection.Close();

            return ds;

        }

        public static object GetCache(string CacheKey)
        {

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

            return objCache[CacheKey];

        }

        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);

        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值