zoukankan      html  css  js  c++  java
  • DMSFrame 之SqlCacheDependency(二)

    上篇文章介绍的是通知模式的缓存机制,这里介绍的是数据库轮循模式处理,这种模式对SQL2005以下的支持还是比较好的

    引擎源码如下:

    /// <summary>
        /// 轮循模式
        /// 数据库缓存通知模式
        /// 1.SELECT  DATABASEPROPERTYEX('DATABASENAME','IsBrokerEnabled') 1 表示启用,0表示未启用
        /// 2.启用IsBrokerEnabled
        /// ALTER DATABASE [DATABASENAME] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
        /// ALTER DATABASE [DATABASENAME] SET ENABLE_BROKER;/ALTER DATABASE [DATABASENAME] SET DISABLE_BROKER;
        /// 3.web.config 添加配置信息
        /// connectionStrings
        /// 4.设置aspnet_regsql.exe的信息,aspnet_regsql –S 服务器名 –U 登陆名 ID –P 密码 –d 数据库名  –ed
        /// </summary>
        [Obsolete("适用于数据库2005以下,2005以上请使用DMSLinqSqlWebCacheNotifyProvider")]
        public class DMSLinqSqlWebCacheProvider : IDMSLinqCacheProvider
        {
    
            System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;
            private static object syncObj = new object();
            public DMSLinqSqlWebCacheProvider()
            {
                lock (syncObj)
                {
                    System.Web.HttpContext context = System.Web.HttpContext.Current;
                    if (context != null)
                        webCache = context.Cache;
                    else
                        webCache = System.Web.HttpRuntime.Cache;
                }
            }
    
            public string GetDependencyKey(System.Data.IDbCommand command, string[] tableNames)
            {
                string dependencyKey = command.CommandText;
                foreach (System.Data.IDbDataParameter item in command.Parameters)
                {
                    dependencyKey += string.Format("-{0}-{1}", item.ParameterName, item.Value);
                }
    #if DEBUG
                System.Diagnostics.Debug.WriteLine(string.Format("{0},use dependency key successfully", dependencyKey));
    #endif
                return dependencyKey;
            }
    
            public object GetCache(string dependencyKey)
            {
                object resultValue = webCache[dependencyKey];
    #if DEBUG
                System.Diagnostics.Debug.WriteLine(string.Format("this cache is empty?:{0}", resultValue == null ? "true" : "false"));
    #endif
                return resultValue;
            }
            public System.Web.Caching.CacheDependency GetCacheDependency(string connectionString, System.Data.IDbCommand command, string[] tableNames, ref string dependencyKey)
            {
                CacheDependency dependency = null;
                try
                {
                    SqlCacheDependencyAdmin.EnableNotifications(connectionString);
                    if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(connectionString).Contains(tableNames[0]))
                    {
                        SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, tableNames[0]);
                    }
                    if (tableNames.Length == 1)
                    {
                        dependency = new SqlCacheDependency("DefaultValue", tableNames[0]);
                    }
                    else
                    {
                        AggregateCacheDependency dependency0 = new AggregateCacheDependency();
                        foreach (var item in tableNames)
                        {
                            dependency0.Add(new SqlCacheDependency("DefaultValue", item));
                        }
                        dependency = dependency0;
                    }
    
                }
                catch (Exception ex)
                {
                    DMSFrame.Loggers.LoggerManager.Logger.Log(ex, ReflectionUtils.GetMethodBaseInfo(System.Reflection.MethodBase.GetCurrentMethod()), DMSFrame.Loggers.ErrorLevel.Fatal);
                }
    #if DEBUG
                System.Diagnostics.Debug.WriteLine(string.Format("Get the sqlcachedependency successfully.{0}", dependency == null ? "false" : "true"));
    #endif
                return dependency;
            }
            public void SetCache(System.Web.Caching.CacheDependency dependency, string dependencyKey, object Value)
            {
                if (dependency != null)
                {
    #if DEBUG
                    System.Diagnostics.Debug.WriteLine(string.Format("Add cache is successfully,{0}", dependencyKey));
    #endif
                    webCache.Insert(dependencyKey, Value, dependency);
                }
            }
        }
    View Code

    同样的,代码也要配置一下.

    <configSections>
        <section name="DMSLinqCacheProvider" type="DMSFrame.Cache.DMSLinqCacheProvider,DMSFrame"/>
      </configSections>
      <DMSLinqCacheProvider>
        <add key="provider" providerName="MsSql" value="DMSFrame.Cache.DMSLinqSqlWebCacheProvider,DMSFrame"/>
      </DMSLinqCacheProvider>

    注意,此处理配置的数据库连接name必须是 DefaultValue,至于为什么是这个,可以看下引擎源码..呵呵,这里就不解释了.....

    <connectionStrings>
        <add  name="DefaultValue" providerName="System.Data.SqlClient" connectionString="Integrated Security=False;server=127.0.0.1;database=DATABASE;User ID=sa;Password=sa;Connect Timeout=30;"/>
      </connectionStrings>

     增加支持 sqlCacheDependency 的配置,轮循时间为1000毫秒

     <system.web>    
        <caching>
          <sqlCacheDependency enabled="true" pollTime="1000">
            <databases>
              <add name="DefaultValue" connectionStringName="DefaultValue" pollTime="500" />
            </databases>
          </sqlCacheDependency>
        </caching>
      </system.web>

    注: databases也可以重写轮循时间的哦...呼呼,不要以为这样就可以了哦..

    还要再检查我们数据库是否支持这个模式的方式呢.这种模式查询SQL会自动在表 AspNet_SqlCacheTablesForChangeNotification 添加一行数据..每更新,删除,插入一次都会增加(更新)一数据的.

    怎么开启AspNet_SqlCacheTablesForChangeNotification 这个..具体可以参考 

    1.为 SQL Server 启用缓存通知
    aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d Northwind -et -t Employees
    为 Northwind 数据库中的 Employees 表启用缓存通知
    aspnet_regsqlcache –S 服务器名称 –U 登陆ID –P 密码 –d 数据库名称 –t 要追踪的数据表的名称 –et

    注:这种模式比较耗数据库性能哦!!!!强烈建议用通知模式吧,具体参考文章:

    DMSFrame 之SqlCacheDependency(一)

  • 相关阅读:
    科技部:中国131家独角兽企业 名单文字版
    Application_Start事件中用Timer做一个循环任务
    HttpRuntime.Cache再学习
    USB 3.0规范中译本 第10章 集线器,主机下行口以及设备上行口规范
    Vue.js 入门教程
    用python爬了自己的微信,原来好友都是这样的!
    小白到大神,Python 密集知识点汇总
    如何处理JS,css与smarty标签的冲突
    全新 Kali Linux 系统安装指南
    xshell连接centos与ubuntu
  • 原文地址:https://www.cnblogs.com/kingkoo/p/4561848.html
Copyright © 2011-2022 走看看