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个数量级.所 ...
随机推荐
- CodeForce---Educational Codeforces Round 3 D. Gadgets for dollars and pounds 正题
对于这题笔者无解,只有手抄一份正解过来了: 基本思想就是 : 二分答案,对于第x天,计算它最少的花费f(x),<=s就是可行的,这是一个单调的函数,所以可以二分. 对于f(x)的计算,我用了nl ...
- andriod的简单用法2
1.在Activity中使用menu //创建菜单项 public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this ...
- JQuery笔记:JQuery和JavaScript的联系与区别
来源:http://www.ido321.com/1019.html ps:LZ觉得这个标题有点大了,超出了能力范围,不喜勿碰.目前只记录LZ能力范围内的,日后持续补充. 一.JQuery对象和DOM ...
- Java学习笔记(3)
“当你定义出一组类的父型时,你可以用子型的任何类来填补任何需要或期待父型的位置” “运用多态时,引用类型可以是实际对象类型的父类”Animal myDog = new Dog(); 三种方法可以防止某 ...
- SVM应用
我在项目中应用的SVM库是国立台湾大学林智仁教授开发的一套开源软件,主要有LIBSVM与LIBLINEAR两个,LIBSVM是对非线性数据进行分类,大家也比较熟悉,LIBLINEAR是对线性数据进行分 ...
- (原创)spring mvc和jersey rest 组合使用时单例对像实例化两次的BUG及解决办法
项目中没用spring 的restTemplate 而是采用 jersey来做rest 的实现,一直用着,也没发现有什么不对,后来加入了,以quartz用硬编码方式实现,结果启动项目的时候报错 ,具体 ...
- tomcat log
$TOMCAT_HOME$/logs/ .out tomcat 启动后的输出日志 ,主要用于输出一些常规的东西,打印的info日志也会在这里输出. 修改tomcat生成的日志位置 在开发/测试环境,日 ...
- windwos iis 7.5 使用html 报405错误
今天遇到了这个问题,网上搜一下基本上都是下面的答案: <form> 没有指定action的话就是文件自身了. .html本身是不可执行的,如果要修改的话,在IIS中站点属性- 主目录 - ...
- java 最佳且开源的反编译工具
1.jad:2.jode 很多gui的反编译工具(decafe,DJ,cavaJ)差不多都是基于jad和jode的.
- jQuery-validate error messages in Twitter ...
http://www.jefclaes.be/2012/11/jquery-validate-error-messages-in.html something satisfactory. In thi ...