基于SqlDependency的Asp.net数据缓存
首先,确保目标数据库的is_broker_enabled已经enabled。
SELECT name, is_broker_enabled FROM sys.databases
如果不是enabled,使用以下语句
ALTER DATABASE DB_Name SET ENABLE_BROKER
GO
使用以下语句授权指定用户订阅Query Notifications
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO "domain name\user name"
以下是c# 源码
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Caching; public class WebCacheHelper<T> where T : class
{
public event FetchDataFromDBHandler<T> OnFetchDataFromDB; public T GetFromCache(string connectionString, string tableName, string cacheKey)
{
var cache = HttpRuntime.Cache;
T data = null; if (cache[cacheKey] != null)
{
return cache[cacheKey] as T;
} using (SqlConnection con = new SqlConnection(connectionString))
using (SqlCommand cmd =
new SqlCommand(string.Format("select 1 from dbo.{0}", tableName)
, con))
{
bool started = SqlDependency.Start(connectionString); con.Open();
cmd.Notification = null;
cmd.NotificationAutoEnlist = true; SqlCacheDependencyAdmin.EnableNotifications(connectionString);
if (!SqlCacheDependencyAdmin.GetTablesEnabledForNotifications(
connectionString).Contains(tableName))
{
SqlCacheDependencyAdmin.EnableTableForNotifications(connectionString, tableName);
} SqlCacheDependency dependency = new SqlCacheDependency(cmd); if (OnFetchDataFromDB != null)
data = OnFetchDataFromDB(started); cache.Insert(cacheKey, data, dependency); cmd.ExecuteNonQuery();
} return data;
}
} public delegate T FetchDataFromDBHandler<T>(bool IsSqlDependecyStarted);
Sample
public class Movie
{
public int ID { get; set; }
public string Title { get; set; } [Display(Name = "Release Date")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; } public string Genre { get; set; }
public decimal Price { get; set; }
} public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
} public class MovieController : Controller
{
private MovieDBContext db = new MovieDBContext(); public ActionResult List()
{
WebCacheHelper<IEnumerable<Movie>> helper = new WebCacheHelper<IEnumerable<Movie>>();
helper.OnFetchDataFromDB += x =>
{
var query = from p in db.Movies
select p;
ViewBag.DataInitilized = "Cache data initialized at " + DateTime.Now.ToLongTimeString();
ViewBag.DependencyStarted = x;
return query.ToList();
};
var model = helper.GetFromCache(db.Database.Connection.ConnectionString, "Movies", "Movie");
return View(model);
}
}
SQL Server2008实测运行成功。 C#代码执行以后,数据库中将自动生成一个名为AspNet_SqlCacheTablesForChangeNotification的表。
原创博文,欢迎转载。转载请注明出处。
基于SqlDependency的Asp.net数据缓存的更多相关文章
- cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )
Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...
- 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)
[名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( ...
- SpringMVC + ehcache( ehcache-spring-annotations)基于注解的服务器端数据缓存
背景 声明,如果你不关心java缓存解决方案的全貌,只是急着解决问题,请略过背景部分. 在互联网应用中,由于并发量比传统的企业级应用会高出很多,所以处理大并发的问题就显得尤为重要.在硬件资源一定的情况 ...
- 基于IBM Bluemix的数据缓存应用实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:IBM® Data Cache for Bluemix 是快速缓存服务.支持 Web 和 ...
- ASP.NET缓存全解析4:应用程序数据缓存 转自网络原文作者李天平
System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和数据集.它还为这些对象提供了失效 ...
- SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]
前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1. <ASP.NET 2.0开发指南> 2. ...
- (转) ASP.NET页面缓存
原文:http://www.cnblogs.com/Sky_KWolf/archive/2010/12/05/1897158.html 静态页面全部内容保存在服务器内存中.当再有请求时,系统将缓存中的 ...
- ASP.NET Core 缓存技术 及 Nginx 缓存配置
前言 在Asp.Net Core Nginx部署一文中,主要是讲述的如何利用Nginx来实现应用程序的部署,使用Nginx来部署主要有两大好处,第一是利用Nginx的负载均衡功能,第二是使用Nginx ...
- ASP.NET 页面缓存
ASP.NET 实现页面缓存页面缓存的使用方法非常的简单,只需要在aspx页的顶部加一句声明<%@ OutputCache Duration="60" VaryByParam ...
随机推荐
- 转:MVVM的基本入门简介
https://mp.weixin.qq.com/s?__biz=MzA3MjA4NjE3NQ==&mid=404502568&idx=1&sn=fe512f9820b99d3 ...
- iOS 设置导航栏 返回按钮文字隐藏
//隐藏返回按钮文字 [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) f ...
- Sql Server 表分区(转)
什么是表分区 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
- Oracle 数据库监听配置
一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的 ...
- C语言之基本算法33—矩阵的基本运算
//矩阵基础 /* ================================================================== 题目:输入矩阵a,b,输出a,b,a的转置矩阵 ...
- react-native 项目实战 -- 新闻客户端(6) -- 完善ListView头部视图
1.因为需要定时器,所以我们要cd到当前项目根目录下安装这个类库: $ npm i react-timer-mixin --save 2.Component/ScrollImage.js /** * ...
- Directional Light,Ambient,Specular,光照感性认识...
- SQLserver备份数据库示例
BACKUP DATABASE [yee]TO DISK = N'D:\数据库备份\yee2015.9.11.bak'WITH NAME = N'yee - 备份', NOFORMAT, NO ...
- C#自动切换Windows窗口程序,如何才能调出主窗口?
namespace AutoChangeWindow { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summ ...
- H265 Rtp封包
H265 Rtp封包可以参考Ffmpeg,具体实现在文件rtpenc_h264_hevc.c(4.0.1版本),核心的方法是nal_send 这个方法有些绕,下面帖子具体的代码及注释. static ...