zoukankan      html  css  js  c++  java
  • 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

    【名词解释】

    缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object。那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( 行级别更改)或者SQL 查询结果的变化。

    以前也总结过缓存的使用

    页面输出缓存:我用ASP.NET缓存之OutputCache

    数据缓存:我用ASP.NET缓存之数据缓存

    但是对缓存依赖还是很模糊,前阵子有幸在项目中实际运用了此类。现在结合自己的实际以及和网上大牛的经验,给大家分享一下。

    【使用背景】

    首先你必须用ASP.Net和SQL Server开发应用,也就是SqlCacheDependency是基于微软的那套体制。同学,如果你不是从事Net开发,先给个赞再Skip吧。

    缓存是用来提高应用性能,降低服务器压力。适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存。

    【我的代码】

    SqlCacheDependency通俗的说利用SQL Server的通信机制,当数据表发生变化时,通知应用程序时删除原有的缓存,更新新的数据。

    首先需要检查SqlServer是否启用Service Broker。

    Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled')          -- 1 表示已经启用 0 表示没有启用

    启用语句

     ALTER DATABASE 数据库名称 SET ENABLE_BROKER;    

    运行启用语句,会出现假死情况,不要紧,停止查询,重新查询一次就可以。

    上面这些来自于网上的一些经验,个人在实际中并没有出现这些情况,状态=0 ,仍然可以使用。我用的是SQL Serve2008,个人觉得高版本的Sql Server 已经不在将这些作为必须条件(个人观点,不同意见,欢迎讨论)。毕竟Net开发走的是一条傻瓜化编程道路。

    接下来就是配置数据库缓存通知。两种方法(MSDN),个人建议采用第二种。

    第一种利用aspnet_regsql.exe(位于WindowsMicrosoft.NETFramework[版本]文件夹中) 工具配置数据库和表开启缓存通知功能。你只需要记住如下命令就能开启:

    aspnet_regsql -S localhost -E -d RWWW -ed -t Options -et

    每个命令代表什么含义,网上有详细的解释。有兴趣的同学可以去了解。运行命令后,配置就可以。这里特别需要注意大小写,笔者在开发中就将表名全部弄成大写,结果花了一个小时的时间,程序始终运行不起来,一直在报错,提示没有为SQL缓存通知启用数据库。结果最后才发现大小写不对。

    第二种就是利用SqlCacheDependencyAdmin类

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

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

    将此两行代码放入Global中Start方法中即可。

    接下来配置配置文件。

    <caching>
          <!--启动缓存依赖,每5秒轮询一次-->
          <sqlCacheDependency enabled="true" pollTime="5000">
            <databases>
              <add name="WWWAccount" connectionStringName="ConnectionString" pollTime="5000"/>
            </databases>
          </sqlCacheDependency>
        </caching>

     这里基本就是固定格式,必须这样配置才可以。

    最后将缓存加入代码中即可,废话不多说,直接上代码。开发中用到了EF的东东。 

    //判断是否已缓存
                    if (System.Web.HttpContext.Current.Cache["Link"] == null)
                    {
                        //如果没有缓存 重新获取数据
                        var links = db.WWW_Link.AsQueryable();
                        //添加到缓存中
                        System.Web.HttpContext.Current.Cache.Insert(
                            "Link",
                            links,
                            new SqlCacheDependency("WWWAccount", "WWW_Link")
                            );
                        //返回数据
                        return links;
                    }
                    //如果已经缓存 返回缓存数据
                    return System.Web.HttpContext.Current.Cache["Link"] as IQueryable<WWW_Link>;

    当表WWW_Link发生变化时,Cache["Link"]会自动更新。这里主意SqlCacheDependency 的第一个参数,它等于App.config中节点name=WWWAccount。

     
  • 相关阅读:
    java提高篇(二四)-----HashSet
    链表(线性表)
    逆置线性表(线性表)
    Android布局_表格布局TableLayout
    Android布局_布局概述和LinearLayout布局
    Android_用户界面概述和数据单位
    Android_SDK的常用命令
    Android_程序结构分析
    CSS3_边框属性之圆角的基本图形案例
    CSS3_边框属性之圆角
  • 原文地址:https://www.cnblogs.com/ttrjba/p/3952429.html
Copyright © 2011-2022 走看看