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[]))
{
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, tableNames[]);
}
if (tableNames.Length == )
{
dependency = new SqlCacheDependency("DefaultValue", tableNames[]);
}
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);
}
}
}
同样的,代码也要配置一下.
<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(一)
DMSFrame 之SqlCacheDependency(二)的更多相关文章
- DMSFrame 之SqlCacheDependency(一)
1.SqlCacheDependency都是我们常用的一种Cache写法了.对后面的SQL 2005算是比较成熟的一种缓存模式了,这里介绍一下DMSFrame的SqlCacheDependency是怎 ...
- DMSFrame 之简单用法(二)
上次说了下DMSFrame的一些查询方式,之前也有好多朋友问了下这个ORM与EF有什么样的区别. 要论区别,我自己也总结了几点.如果有其它朋友知道的,可以回复补充下. 1.不需要编辑的时候需要再次查询 ...
- 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. ...
- asp.net mvc5中使用缓存依赖SqlCacheDependency
缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...
- SqlDependency和SqlCacheDependency缓存的用法及具体步骤
SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决什么问题? Asp.Net中的cac ...
- mvc 缓存 sqlCacheDependency 监听数据变化
mvc 缓存 对于MVC有Control缓存和Action缓存. 一.Control缓存 Control缓存即是把缓存应用到整个Control上,该Control下的所有Action都会被缓存起来 ...
- SqlCacheDependency:asp.net SQL缓存依赖
先看下MSDN对此类的介绍: 在以下两者之间建立关系:一是在 ASP.NET 应用程序的 Cache 对象中存储的项:二是特定 SQL Server 数据库表或 SQL Server 2005 查询 ...
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
随机推荐
- 免费好用的web应用托管平台-续
上一篇博客给大家推荐了目前处于免费阶段的PAAS平台,可以托管各种应用,大家反响很不错,说明大家还是很需要和认可这个免费托管各种web应用的京东云擎平台.但是很多用户还是很担心未来可能还是会收费,对于 ...
- MultiTouch————多点触控,伸缩图片,变换图片位置
前言:当今的手机都支持多点触控功能(可以进行图片伸缩,变换位置),但是我们程序员要怎样结合硬件去实现这个功能呢? 跟随我一起,来学习这个功能 国际惯例:先上DEMO免费下载地址:http://down ...
- JNI技术基础(1)——从零开始编写JNI代码
众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...
- Android 学习之--android多线程断点下载
我们平时都用"迅雷"下载软件,当下载到一半的时候突然断网,下次开启的时候能够从上次下载的地方继续下载,而且下载速度很快,那么这是怎么做到的呢! 其实它的“快”其实就是多线程的下载实 ...
- 在VC项目中附加包含目录
1.VC2010项目中附加包含目录 上图项目中附加了两个文件夹,一个是上级目录下的CommonClass,一个是下级目录下的invengo. 使用这两个目录下的类时直接在include后面写头文件名即 ...
- JQ中mouseover和mouseenter的区别
我最近也在学习JQuery,所以最近对JQ中的一些小问题进行总结,方便学习. 在对于刚开始学习JQ的初学者来说,mouseover事件和mouseenter事件总是傻傻分不清楚,毕竟刚开始学习的时候, ...
- 取消 virtualStore 注册表[启用和禁止 UAC虚拟化]
近日发现,在win2008R2 x64下运行的服务器程序,其注册表读取路径为: [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\SZDomain\itvc1] 但是经 ...
- 【地图API】收货地址详解2
上次讲解的方法是: 在地图中心点添加一个标注,每次拖动地图就获取地图中心点,再把标注的位置设置为地图中心点.可参考教程:http://www.cnblogs.com/milkmap/p/6126424 ...
- windows server 2008 R2 FTP登陆错误。
建立了一个域用户ftp. 始终登陆不上winserver 2008 R2上的FTP. 错误如下: 530-User cannot log in. Win32 error: Logon failur ...
- 虚方法的调用是怎么实现的(单继承VS多继承)
我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确 ...