DMSFrame 之SqlCacheDependency(一)
1.SqlCacheDependency都是我们常用的一种Cache写法了。对后面的SQL 2005算是比较成熟的一种缓存模式了,这里介绍一下DMSFrame的SqlCacheDependency是怎么使用的
DMSFrame已内置MSSQL的通知模式(MSSQL2005以上,含2005)和轮循模式(MSSQL2005以下)的缓存写法。
查看数据库是否支持通知模式
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日志信息
exec sp_changedbowner @loginame = '[当前数据库登录用户名,如果是sa,则使用sa账号]'
首先添加web.config的配置信息
<configSections>
<section name="DMSLinqCacheProvider" type="DMSFrame.Cache.DMSLinqCacheProvider,DMSFrame"/>
</configSections>
<DMSLinqCacheProvider>
<add key="provider" providerName="MsSql" value="DMSFrame.Cache.DMSLinqSqlWebCacheNotifyProvider,DMSFrame"/>
</DMSLinqCacheProvider>
最最重要的TableConfig配置数据库加上标记CacheDependency,已便支持CacheDependency
<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 == )
.Select(q => q.Columns(q.UserID, q.UpdateTime)).ToList(true);
通知模式的SQL运行跟踪如图:

相关下载: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);
}
}
}
DMSFrame 之SqlCacheDependency(一)的更多相关文章
- DMSFrame 之SqlCacheDependency(二)
上篇文章介绍的是通知模式的缓存机制,这里介绍的是数据库轮循模式处理,这种模式对SQL2005以下的支持还是比较好的 引擎源码如下: /// <summary> /// 轮循模式 /// 数 ...
- DMSFrame 之简单用法(二)
上次说了下DMSFrame的一些查询方式,之前也有好多朋友问了下这个ORM与EF有什么样的区别. 要论区别,我自己也总结了几点.如果有其它朋友知道的,可以回复补充下. 1.不需要编辑的时候需要再次查询 ...
- DMSFrame 之简单用法(一)
1.DMSFrame是一个完整的ORM框架,框架相对来说也比成熟了.使用上有些地方还是比较方便的.DLL文件大约300K左右,但却可以支持各种方式的查询,完全的LINQ化的方式书写代码,更有利于维护. ...
- 【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
Sql server 7.0/2000下 SqlCacheDependency使用轮询的方式进行缓存失效检查, 虽然ms说对服务器压力不大, 但还是有一些的, 而且对于不常改动的混存内容无休止的轮询感 ...
- cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )
Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...
- SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]
前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1. <ASP.NET 2.0开发指南> 2. ...
- 使用SqlCacheDependency依赖项让数据库变化后缓存失效
SqlCacheDependency可以使缓存在数据库或者数据库某张表或者字段变化后让指定缓存失效.对于一些需要及时显示的信息比较有用. 需要.net2.0以后设sql server2005及以后版本 ...
- sqlCacheDependency 更新缓存Cache
第一步 修改web,config <!--定义数据库连接--> <connectionStrings> <add name="NorthwindConnect ...
- SqlCacheDependency的使用
最近项目需要几秒就获取一次数据,查数据库服务器压力会很大,因此用缓存技术来缓解服务器压力. 使用SqlCacheDependency采用轮询的方式来获取缓存,SqlDependency查询通知的方式来 ...
随机推荐
- crontab定时任务配置记录
一.前言 今天简单记录下crontab的配置 二.crontab目录 /etc/crontab 文件 这是系统运行的调度任务 /var/spool/cron 目录 用户自定义的crontab任务放在此 ...
- redis 内存
ziplist:http://blog.csdn.net/benbendy1984/article/details/7796956 redis 内部存储结构:http://www.searchtb.c ...
- VS2013编译经常卡在正在从以下位置加载xxx.dll的符号
换了系统后,重新下载了一个vs2013 with update2安装,编译的时候总是卡在 正在从以下位置加载xxx.dll的符号 如图: 解决方法: 进入VS---工具---选项----调试----符 ...
- Leetcode 160 Intersection of Two Linked Lists 单向链表
找出链表的交点, 如图所示的c1, 如果没有相交返回null. A: a1 → a2 ↘ ...
- 给同为.NET开发者普及一点Oracle数据库经验
前段时间,因为要给自己开发的搜易站内搜索引擎增加Oracle数据库的支持,所以学习了下Oracle的基础知识,发现使用方式跟MYSQL,MSSQL等数据库的思维有很大的不同,总结一下几点不同,希望给初 ...
- loadlibrary DLL 0失败 的一个原因。
加载DLL失败,因为 dll 中有一个全局类变量,由于在构造函数 没有初始化变量,导致 初始化 失败 异常. C++ 变量没有初始值,全部都要 手动赋值 为 0 的这个特性 还真是烦人呢...
- mysqld.exe 占了400M内存的问题
最近遇到了服务器总是停机的问题,虽然它自己只有2G的内存,不过实际部署的应用访问量非常小,也不至于2G就不够用,所以开始了给服务器瘦身的计划. 看着任务管理器里面的各个进程,发现吃内存最厉害的是mys ...
- django关闭debug后,静态文件的处理
Django框架仅在开发模式下提供静态文件服务.当我开启DEBUG模式时,Django内置的服务器是提供静态文件的服务的,所以css等文件访问都没有问题,但是关闭DEBUG模式后,Django便不提供 ...
- C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]
研究了一下KeyDown,KeyPress 和KeyUp ,发现之间还是有点学问的. 让我们带着如下问题来说明,如果你看到这些问题你都知道,那么这篇文章你就当复习吧:) 1.这三个事件的顺序是怎么样的 ...
- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据
---------------------目录-------------------------- EntityFramework 5.0 CodeFirst 教程04-查询,插入,更新,和删除数据 ...