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个数量级.所 ...
随机推荐
- SVM:从理论到OpenCV实践
(转载请注明出处:http://blog.csdn.net/zhazhiqiang/ 未经允许请勿用于商业用途) 一.理论 参考网友的博客: (1)[理论]支持向量机1: Maximum Marg ...
- CentOS搭建LAMP环境
最近准备安装roundcube,需要先搭建一个 LAMP 运行环境,从网上搜索了一下,有不少资料.自己也按部就班安装了一遍,把过程整理了下来. LAMP 是Linux, Apache, MySQL, ...
- Android多媒体--MediaCodec的实例化方法
*由于作者水平限制,文中难免有错误和不恰当之处,望批评指正. *转载请注明出处:http://www.cnblogs.com/roger-yu/ MediaCodec的实例化方法主要有两种: 1.使用 ...
- poj1001 Exponentiation
Description Problems involving the computation of exact values of very large magnitude and precision ...
- SQL Server 跨库连接
-- 开启组件 reconfigure reconfigure -- 关闭组件 reconfigure reconfigure -- 查询远程数据库 SELECT * FROM OPENDATASOU ...
- NodeJS学习:爬虫小探补完计划
说明:本文在个人博客地址为edwardesire.com,欢迎前来品尝. 书接上回,我们需要修改程序以达到连续抓取40个页面的内容.也就是说我们需要输出每篇文章的标题.链接.第一条评论.评论用户和论坛 ...
- 转】Maven学习总结(五)——聚合与继承
原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4058008.html 感谢! 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1. ...
- SAE 合并图片
$domain = 'picleader'; //图片库的域名 $stgurl = 'http://lemonluoxing-picleader.stor.sinaapp.com/'; //绝对路径 ...
- thymeleaf比较符号问题
比较器与平等: 值表达可以是>.<.> =.< =符号,像往常一样,也是= =和!=操作符可以用来检查平等,但是>.<.> =.< =不能用,要用gt ...
- get和eq的区别
<p style="color:yellow">绯雨</p> //使用eq来获得第一个p标签的color值: console.log().css(" ...