SqlDependency和SqlCacheDependency缓存的用法及具体步骤
SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表。
SqlDependency能解决什么问题?
Asp.Net中的cache可以设置一个过期时间,但设置多久合适呢?长了浪费,短了就失去缓存的意义了。使用SqlDependency进行缓存则可以解决这个问题。
SqlDependency是.net2.0封装的一个类型,要配合sql2005或以上版本才能使用。
另外,SqlDependency类需要数据库的ServiceBroker来支持,当数据库中的数据发生变化时通知应用程序更新缓存,这才是最有效的缓存方式。
SqlDependency配合ServiceBroker实现缓存
步骤一:
sql数据库必须开启ServiceBroker服务,首先检测是否已经启用ServiceBroker,检测方法:
- Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled')
--1表示已经启用0表示没有启用
步骤二:
如果ServiceBroker没有启用,使用下面语句启用:
- ALTER DATABASE <数据库名称> SET ENABLE_BROKER;
步骤三:
在实现基于服务的SQL数据缓存依赖过程中,需要显式调用SqlDependency.Start来启动接受依赖项更改通知的侦听器。
- SqlDependency.Start(connectionString);//推荐将这段代码加到Global.asax的Application_Start方法中
- SqlDependency.Stop(connectionString);//用于关闭,可加在Global.asax的Application_End方法中
步骤四:缓存实现
使用sqldependency实现缓存的代码:
- public class CacheHelper {
- static Cache WebCache = HttpContext.Current.Cache;
- static string DefaultConn = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
- public static DataTable GetSystemParams() {
- if (WebCache["SystemParam"] == null) {
- string strSQL = "select uSystemParamID,ParamName,ParamValue,Description from dbo.DTS_SystemParam";
- SqlDataAdapter da = new SqlDataAdapter(strSQL, DefaultConn);
- SqlDependency dep = new SqlDependency(da.SelectCommand);
- dep.OnChange += new OnChangeEventHandler(dep_OnChange);
- DataTable tbl = new DataTable(); da.Fill(tbl);
- WebCache["SystemParam"] = tbl;
- return tbl;
- }
- else {
- return (DataTable) WebCache["SystemParam"];
- }
- }
- private static void dep_OnChange(object sender, SqlNotificationEventArgs e) {
- WebCache.Remove("SystemParam");
- }
- }
注意:
使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀)例如:select * from table1,select column1 from table1,select count(*) from table1 都是错误的sql查询语句,select column1 from dbo.table1 则是正确的语句。
有关SqlDependency 的用法,还可以参考如下步骤的实现方式:
1. 注册连接池
- 命令:aspnet_regsql -S 192.168.30.220\SQL2K -U sa -P sa -ed -d pubs -et -t test专门注册连接池的工具 在sql数据库的数据 库改变了,才改变缓存。
参数:
_s 制定注册的服务器
_u和 _p 说明是sql数据库的授权模式、_d 指定数据库的名字
_ed 说明缓存生效。
示例:
- aspnet_regsql -S 192.168.30.220\SQL2K -U sa -P sa -ed -d pubs -et -t test
进行outputcache配置
- <%@ OutputCache SqlDependency="pubs:test" Duration="100" VaryByParam="id"%>
2. 设置WebConfig
- <connectionStrings>
- <add name="mySqlServer" connectionString="Server=192.168.30.220\SQL2K;Database=pubs;uid=sa;pwd=sa;"/>
- </connectionStrings>
- <caching>
- <sqlCacheDependency enabled="true">
- <databases>
- <add
- connectionStringName="mySqlServer"
- pollTime="500" />
- </databases>
- </sqlCacheDependency>
- </caching>
name:必须是数据库的名字
connectionStringName:连接字符串的名称
除了可以建立数据库依赖,还可以建立文件依赖或者其他依赖。
SqlCacheDependency的用法
SqlCacheDependency的使用需经过几个具体的设置步骤:
该实例中,SqlCacheDependency缓存依赖该数据表,即如果表中数据发生了变化,缓存应该失效。
1. 修改web.config,启用SqlCacheDependency。将下列代码加入web.config的<system.web>节:
- <caching>
- <sqlCacheDependency enabled="true">
- <databases>
- <add connectionStringName="regex_libConnectionString" name="IPBlockedDependency"/>
- </databases>
- </sqlCacheDependency>
- </caching>
这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
2. 执行下述命令,为数据库启用缓存依赖:
- C:\Program Files\Microsoft Visual Studio 9.0\VC>aspnet_regsql -C "Data Source=.;Initial Catalog=regex-lib;Integrated Security=True" -ed -et -t "IPBlocked"这里-C后面的字符串是连接字符串(请替换成自己所需要的值),-t参数后面的字符串是数据表的名字。命令执行后,数据库中会多出一个AspNet_SqlCacheTablesForChangeNotification表。
3. 在代码中使用缓存,并为其设置SqlCacheDependency依赖:
- private static string[] GetBlockedIPs()
- {
- // 1尝试从缓存中读取
- string[] ips = (string[])HttpContext.Current.Cache[BlockedIPCacheKey];
- if (ips != null)
- return ips;
- // 2从数据库中读取
- using (RxDataContext db = new RxDataContext())
- {
- ips = db.IPBlockeds.Select(ipb => ipb.UserIP).ToArray();
- }
- // 3放入缓存
- SqlCacheDependency depend = new SqlCacheDependency("IPBlockedDependency", "IPBlocked");
- HttpContext.Current.Cache.Insert(BlockedIPCacheKey, ips, depend);
- return ips;
- }
创建SqlCacheDependency时需要指定web.config中定义的SqlCacheDependency名字,并指定数据表的名称。
SqlDependency和SqlCacheDependency缓存的用法及具体步骤的更多相关文章
- 当数据库某张表数据发生变化时,更新c#程序中缓存的用法
参考:http://www.webkaka.com/tutorial/asp.net/2012/111912/(SqlDependency和SqlCacheDependency缓存的用法及具体步骤) ...
- django之缓存的用法, 文件形式与 redis的基本使用
django的缓存的用法讲解 1. django缓存: 缓存的机制出现主要是缓解了数据库的压力而存在的 2. 动态网站中,用户的请求都会去数据库中进行相应的操作,缓存的出现是提高了网站的并发量 3. ...
- OpenGL ES为缓存提供数据的7个步骤
OpenGL ES为缓存提供数据的7个步骤: 1.生成glGenBuffers()——请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符. 2.绑定glBindBuffer()——告 ...
- SQL Server SqlCacheDependency 缓存依赖
SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1 轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持 主要包含以下几步: 1. ...
- [转]ASP.NET cache缓存的用法
本文转自:https://blog.csdn.net/mss359681091/article/details/51076712 本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpC ...
- python自带缓存lru_cache用法及扩展(详细)
本篇博客将结合python官方文档和源码详细讲述lru_cache缓存方法是怎么实现, 它与redis缓存的区别是什么, 在使用时碰上functiontools.wrap装饰器时会发生怎样的变化, ...
- ASP.NET Cache缓存的用法
本文导读:在.NET运用中经常用到缓存(Cache)对象.有HttpContext.Current.Cache以及HttpRuntime.Cache,HttpRuntime.Cache是应用程序级别的 ...
- THinkphp开启静态(动态)缓存的用法
<?php return array( //开启静态缓存 'HTML_CACHE_ON' => true, 'HTML_CACHE_RULES' => array( 'News:in ...
- Memcached命令:简单获取缓存value用法
Memcached:命令用法1.cmd 输入telnet ip 端口 进入memcached服务端窗口比如:xxx.Token_T1435622096xxx为key获取此key的memcached ...
随机推荐
- SQL-20 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
题目描述 查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growthCREATE TABLE `salaries` (`emp_no` int(11) NOT NULL,`s ...
- SQL-14 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。 注意对于重复的emp_no进行忽略。
题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t.注意对于重复的emp_no进行忽略.CREATE TABLE IF NOT EXISTS &q ...
- Class file collision
ecplise报错,提示:Class file collision (类文件冲突) 原因是:文件保存(编译)后,生成了class文件起了冲突,windows 系统认为Test.class 和test. ...
- Linux分区和挂载的理解
在工作中经常使用到Linux,对分区和挂载的概念一直都很模糊,对网上的信息进行了整理,方便理解. 1为什么要分区(需理解硬盘的组成) 1)数据的安全性,因为每个分区的数据是分开的.所以,当你需要将某个 ...
- Java语法基础学习DayFour
一.面向对象 1.特点: A:是一种更符合我们思考习惯的思想B:把复杂的事情简单化C:让我们从执行者变成了指挥者 2.使用: a:创建对象格式类名 对象名 = new 类名();b:如何使用成员变量和 ...
- <Spark><Programming><Loading and Saving Your Data>
Motivation Spark是基于Hadoop可用的生态系统构建的,因此Spark可以通过Hadoop MapReduce的InputFormat和OutputFormat接口存取数据. Spar ...
- css 1) calc() 函数的使用. 2)box-sizing:border-box
calc() 是一个css 函数, 可以实现.计算 ---------------------------- 1. 每个div宽度是25%; 总共4个div. 同时 前三个div 有 border-r ...
- MYSQL MyISAM与InnoDB对比
1. 区别: (1)事务处理: MyISAM是非事务安全型的,而InnoDB是事务安全型的(支持事务处理等高级处理): (2)锁机制不同: MyISAM是表级锁,而InnoDB是行级锁: (3)sel ...
- Javascript将数据转成英文书写格式
var aTens = [ "TWENTY", "THIRTY", "FORTY", "FIFTY", "SI ...
- ubuntu sublime text key
使用方法 打开 Sublime Text 3 的 “Help”–“Enter Licence”,然后根据版本选择输入下面的注册码. 注册码 所有这些注册码都经过测试(2016-05-12),适用于所有 ...