zoukankan      html  css  js  c++  java
  • ASP.NET MVC 数据库依赖缓存的实现

    当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础。应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个表里面有1000行数据我要是读100次的话是不是得比较1000 x 100 次,显然这种方法是不可行的,那怎么办呢?大家都学过触发器吧,实现数据库依赖缓存的轮询机制就是通过触发器来实现的。

    实现步骤简单分析:
         首先创建一个用于记录监控信息的表,表的字段就两个一个是表名,一个是版本号。然后,对需要监控的变增加一个触发器,当表的内容发生变化的时候进行触发。我们可以用insert delete update 触发器,如果一旦触发以上动作就在把那个监控表的版本号字段加1。
      上面的步骤要我们自己动手实现起来很麻烦,但微软早就为我们提供好了一个工具叫Aspnet_regsql.exe 这个工具位于C:WindowsMicrosoft.NETFrameworkv4.0.30319这个路径下(也不一定但是一般就是这个路径)好了有工具了具体怎么用呢?打开cmd,输入以下命令行切换到aspnet_regsql.exe的运行根目录。

    cd C:WindowsMicrosoft.NETFrameworkv4.0.30319

    具体帮助请执行命令aspnet_regsql /? 查看下面列出本文要用到的参数

    •       -S 服务器 
    •       -E 使用当前Windows凭据进行身份验证 
    •       -U 用户名
    •   -P 密码
    •   -d 数据库名称,默认为aspnetdb数据库
    •   -ed 为数据库打开SQL缓存依赖支持
    •   -dd 关闭数据库的SQL缓存依赖支持
    •   -et 指定SQL缓存依赖使用的表,需要使用-t指定表名
    •   -dt 禁用SQL 缓存依赖使用的表,需要使用-t指定表名
    •   -t 指定表名
    •   -lt 列出启用缓存依赖的表名


    然后就可以通过命令为SQL缓存依赖项启用House数据库以及Home表,具体命令如下:

    aspnet_regsql -S . -E -ed -d House -et -t Home

    附:如果已为SQL缓存依赖项启用House数据库,只是单纯为SQL缓存依赖项启用Home表,就可以执行以下命令:

    aspnet_regsql -S . -E -d House -et -t Home

    为SQL缓存依赖项禁用Home表则执行以下命令:

    aspnet_regsql -S . -E -d House -dt -t Home

    为SQL缓存依赖项启用House数据库以及Home表后数据库会发生以下变化:

    1. 增加了一个名称为AspNet_SqlCacheTablesForChangeNotification的表

    2. Home表中增加了一个触发器

    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER TRIGGER [Home_AspNet_SqlCacheNotification_Trigger] ON [dbo].[Home]
                           FOR INSERT, UPDATE, DELETE AS BEGIN
                           SET NOCOUNT ON
                           EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'Home'
                           END

    3. 增加了几个存储过程  如下图所示:

    打开AspNet_SqlCacheTablesForChangeNotification的表后会发现以下几个字段:

    基本上和开始描述的步骤差不多,它这还多了一个有关时间的列,下面手动修改一个Home表中的数据看看这个监视表有什么变化。

    结果 changeId 数值改变了!应用程序就是定期查询这个表的变化然后确定是否需要更新缓存。

    数据库配置完毕后,在ASP.NET MVC项目中进行配置,打开Web.config在system.web 节点下加入以下代码:

    <!-- 基于数据库的缓存依赖 -->
        <caching>
          <sqlCacheDependency enabled="true">
            <databases>
              <add name="PostCacheDependency" connectionStringName="SqlConnectString" pollTime="6000"/>
            </databases>
          </sqlCacheDependency>
        </caching>

    其中 pollTime 属性就是应用程序间隔多长时间主动访问一次数据库默认为1分钟,最低为500ms,单位为ms。

    实现数据库依赖缓存的核心代码在缓存类添加即可(请根据需求进行修改):

                        SqlCacheDependency dependencies = string.IsNullOrEmpty(tableName) ? null : new SqlCacheDependency("PostCacheDependency", tableName);
                        if (cacheTime != 0)
                        {
                            caches.Insert(key, data, dependencies, DateTime.UtcNow.AddMinutes(cacheTime), Cache.NoSlidingExpiration);//System.Web.Caching.Cache.NoAbsoluteExpiration
                        }
                        else
                        {
                            caches.Insert(key, data, dependencies, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0));
                        }

    absoluteExpiration:表示所插入对象将到期并被从缓存中移除的时间。 要避免可能的本地时间问题(例如从标准时间改为夏时制),请使用 System.DateTime.UtcNow 而不是 System.DateTime.Now 作为此参数值。 如果使用绝对到期,则 slidingExpiration 参数必须为 System.Web.Caching.Cache.NoSlidingExpiration。

    slidingExpiration:表示最后一次访问所插入对象时与该对象到期时之间的时间间隔。 如果该值等效于 20 分钟,则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。简单来说,就是自访问起的20分钟内不被访问就移除缓存。如果使用可调到期,则 absoluteExpiration 参数必须 System.Web.Caching.Cache.NoAbsoluteExpiration。

  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/feiyuhuo/p/5410501.html
Copyright © 2011-2022 走看看