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