SqlDependency缓存数据库表小案例
SqlDependency的简介:
SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表。
SqlDependency能解决什么问题?
Asp.Net中的cache可以设置一个过期时间,但设置多久合适呢?长了浪费,短了就失去缓存的意义了。使用SqlDependency进行缓存则可以解决这个问题。
SqlDependency是.net2.0封装的一个类型,要配合sql2005或以上版本才能使用。
另外,SqlDependency类需要数据库的ServiceBroker来支持,当数据库中的数据发生变化时通知应用程序更新缓存,这才是最有效的缓存方式。
应用:
1启动数据库的ServiceBroker的服务
(1)查询是否启动ServiceBroker服务Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') 1表示启动,0表示尚未启动
(2)ALTER DATABASE <数据库名称> SET ENABLE_BROKER; 该sql用于启动ServiceBroker服务
2配置webconfig
(1)添加链接语句的xml
<connectionStrings>
<add name="Shop" providerName="System.Data.SqlClient" connectionString="Data Source=.; Initial Catalog=数据库名称; Persist Security Info=True;User ID=用户名;Password=密码"/>
</connectionStrings>
(2)在<system.web>节点中添加缓存配置的xml
<caching>
<sqlCacheDependency enabled="true">
<databases>
<add name="CacheDependency_NHibernateSampleDb" connectionStringName="链接字符串的名字" pollTime="1500"/>
</databases>
</sqlCacheDependency>
</caching>
(3)编写底层代码(功用方法)
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="CacheName">缓存的名称</param>
/// <param name="TableName">缓存的数据表的名称</param>
/// <param name="sqlStr">sql语句</param>
/// <returns></returns>
public static DataSet GetCacheData(string CacheName, string TableName, string sqlStr)
{
System.Web.Caching.Cache Cache = HttpRuntime.Cache;
//要检测的数据库
System.Web.Caching.SqlCacheDependencyAdmin.EnableNotifications(
"通过xml得到的链接字符串");
//初检测数据库中要检测的表
System.Web.Caching.SqlCacheDependencyAdmin.EnableTableForNotifications(
"通过xml得到的链接字符串", TableName);
System.Web.Caching.SqlCacheDependency scd = new System.Web.Caching.SqlCacheDependency("CacheDependency_NHibernateSampleDb", TableName); //此处可以加入自己的其它方法,如重新从数据库取得资料
DataSet ds = new DataSet();
using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection("通过xml得到的链接字符串"))
{
string sql = sqlStr; using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
SqlDependency.Start("通过xml得到的链接字符串");
System.Web.Caching.SqlCacheDependency dependency = new System.Web.Caching.SqlCacheDependency(command);
using (System.Data.SqlClient.SqlDataAdapter adapter = new System.Data.SqlClient.SqlDataAdapter()) //查询数据
{
adapter.SelectCommand = command;
adapter.Fill(ds);
}
Cache.Insert(CacheName, ds, scd);
} }
return ds;
}
(4)应用
public void GetMAxPriceByCach(HttpContext context)
{
var biddId = context.Request["biddId"];
decimal CountDownPrice = new BLL.BiddingManager().GetALLvw_BiddingProductByBiddingId(Convert.ToInt32(biddId)).CountDownPrice;//获取起拍价格
//创建缓存
System.Web.Caching.Cache Cache = HttpRuntime.Cache;
//创建数据集
DataSet ds = new DataSet();
//拼写sql语句
string sqlStr = "select Count(*) as num from Auction where BiddingId=" + biddId + ";" + "select Max(Auctiomnoney) as pri from Auction where BiddingId=" + biddId + "";
//判断缓存是不是为空 如果为空则通过底层方法得到新的数据 否则直接从缓存中读取数据
if (Cache["data_" + biddId] == null)
{
ds = Comm.ExpansionClass.GetCacheData("data_" + biddId, "Auction", sqlStr);
}
else
{
ds = (DataSet)Cache["data_" + biddId];
} string maxPrice = "";
if (ds.Tables[].Rows[]["num"].ToString() == "")
{
maxPrice = CountDownPrice.ToString("f2");
}
else
{
maxPrice = decimal.Parse(ds.Tables[].Rows[]["pri"].ToString()).ToString("f2");
}
context.Response.Write("{\"maxPrice\":\"" + maxPrice + "\"}");
}
这样这个用SqlDependency他实现的缓存小案例就技术啦!只有缓存的数据表中的数据发生增删改查等变化的时候才会重新根绝传入的sql重新读取数据库中的数据。值得注意的是:他只能执行简单的sql语句,在sql语句中不能带有用*,不能用top,不能用函数,包括聚合函数,不能用子查询,包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,表名之前必须加类似dbo数据库所有者这样的前缀
SqlDependency缓存数据库表小案例的更多相关文章
- 数据库的小案例(三):用递归实现TreeView层级显示
从这个小案例我学到了不少知识.这些无论如何无法从书里得来.正所谓实践出真知,学习编程需要大量实践这句话永不过时. 首先:好的代码和坏的代码带来的性能上的差异很明显.好的策略可以让你的程序运行速度大大加 ...
- iptables filter表小案例
案例1:把80端口,22端口,21端口放行 22端口指定IP访问,其它IP拒绝. shell脚本实现: [root@centos7 ~]# vim /usr/local/sbin/iptables.s ...
- 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...
- SqlDependency C#代码监听数据库表的变化
SqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- mysql 数据库分表小实例
项目开发中,我们的数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询书读变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. 当出现这种情况时,我们可以考虑分表,即将单 ...
- c#本地缓存当数据库表更改时,缓存失效。
web.config <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应 ...
- 数据库表转换成javaBean对象小工具
package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...
- Mysql数据库一个小程序实现自动创建分表。
每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误. 为了解决这个问题,研究了一下mysql的 information_schema 表: information_schema ...
- SQL优化的四个方面,缓存,表结构,索引,SQL语句
一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所 ...
随机推荐
- Nonlinear Transform
前文中,我们已经学习了linear classification,linear regression,logistic regression三种线性方法. 如何解决这种问题呢? 其实很好解决,只需要加 ...
- AHOI2013 Round2 Day2 简要题解
第一题: 第一问可以用划分树或主席树在O(nlog2n)内做出来. 第二问可以用树状数组套主席树在O(nlog2n)内做出来. 我的代码太挫了,空间刚刚卡过...(在bzoj上) 第二题: 分治,将询 ...
- 国外PHP学习网站书籍资料汇总
这篇文章汇总了全面多样的PHP学习资源,包括书籍.网站.文章等,帮助你提高PHP开发能力,巩固PHP知识.结合上一篇<重磅资料!Github上的PHP资源汇总大全>,一定可以让你的PHP技 ...
- 【转】iOS开发工具系列(按功能分)
http://www.cocoachina.com/newbie/basic/2014/0417/8187.html 这是我们多篇iOS开发工具系列篇中的一篇,此前的文章比如:那些不能错过的Xcode ...
- POJ 3268 Silver Cow Party (最短路dijkstra)
Silver Cow Party 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/D Description One cow fr ...
- nyoj 127 星际之门(一)
星际之门(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门 ...
- 咏南CS多层插件式开发框架支持最新的DELPHI XE7
DATASNAP中间件: 中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守: 可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码: 支持传统TCP/IP方式也支持RE ...
- iOS开发60分钟入门
原文:https://github.com/qinjx/30min_guides/blob/master/ios.md 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的i ...
- 12个有趣的C语言面试题
摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int ma ...
- 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 输入: 每个输 ...