DMSFrame 之SqlCacheDependency(一)

1.SqlCacheDependency都是咱們經常使用的一種Cache寫法了。對後面的SQL 2005算是比較成熟的一種緩存模式了,這裏介紹一下DMSFrame的SqlCacheDependency是怎麼使用的html

DMSFrame已內置MSSQL的通知模式(MSSQL2005以上,含2005)和輪循模式(MSSQL2005如下)的緩存寫法。web

 

查看數據庫是否支持通知模式sql

SELECT  DATABASEPROPERTYEX('DATABASENAME','IsBrokerEnabled') 1 表示啓用,0表示未啓用

啓用IsBrokerEnabled數據庫

ALTER DATABASE [DATABASENAME] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [DATABASENAME] SET ENABLE_BROKER;/ALTER DATABASE [DATABASENAME] SET DISABLE_BROKER;

設置權限信息緩存

GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [當前數據庫登陸用戶名,若是是sa能夠跳過]

修改登陸帳號信息,這裏比較關鍵,若是未設置有可能通知是沒有權限的。具體也能夠看看SQL日誌信息ide

exec sp_changedbowner @loginame = '[當前數據庫登陸用戶名,若是是sa,則使用sa帳號]'

首先添加web.config的配置信息this

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

 

 

最最重要的TableConfig配置數據庫加上標記CacheDependency,已便支持CacheDependencyspa

<TableConfiguration>
    <Name>DefaultValue</Name>
    <SqlType>MsSql</SqlType>
    <WithLock>false</WithLock>
    <Author>dbo</Author>
    <CacheDependency>true</CacheDependency>
    <ConnectString>Integrated Security=False;server=127.0.0.1;database=database;User ID=sa;Password=sa;Connect Timeout=30</ConnectString>
  </TableConfiguration>

 

最後就是查詢SQL了,日誌

ToList(bool DependencyFlag) 增長了是否使用緩存的標記參數。
var resultAccess = DMS.Create<Adm_User>()
                .Where(q => q.UserID == 1)
                .Select(q => q.Columns(q.UserID, q.UpdateTime)).ToList(true);

 

通知模式的SQL運行跟蹤如圖:code

 

 相關下載:http://files.cnblogs.com/files/kingkoo/DMSFrameRights.zip 此版本爲之前的一個版本,最新的版本請加羣問羣主吧

新上傳DMSFrame版本文件:http://files.cnblogs.com/files/kingkoo/DMSFrame_Secure20150606.7z

 

內置代碼引擎以下:

 /// <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.GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [當前數據庫登陸用戶名,若是是sa能夠跳過]
    ///  
    /// 4.exec sp_changedbowner @loginame = '[當前數據庫登陸用戶名,若是是sa,則使用sa帳號]'
    /// 
    /// </summary>
    public class DMSLinqSqlWebCacheNotifyProvider : IDMSLinqCacheProvider
    {

        System.Web.Caching.Cache webCache = System.Web.HttpRuntime.Cache;
        private static object syncObj = new object();
        public DMSLinqSqlWebCacheNotifyProvider()
        {
            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)
        {
            System.Web.Caching.SqlCacheDependency dependency = null;
            try
            {
                dependency = new System.Web.Caching.SqlCacheDependency((System.Data.SqlClient.SqlCommand)command);
            }
            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
相關文章
相關標籤/搜索