Asp.net数据库缓存依赖

  更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能。但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据就是老的数据,从而导致数据的不一致。那有没有办法做到,数据如果不变化,用户就一直从缓存中取数据,一旦数据变化,系统能自动更新缓存中的数据,从而让用户得到更好的用户体验。

  答案是肯定的!.NET已经为我们提供了这样一种非常好的解决方法:SqlCacheDependency数据库缓存依赖。

  实现步骤:

  下面就让我们看一下如何实现数据库缓存依赖功能:

  第一步: 修改web.config,让项目启用SqlCacheDependency 。

  将下列代码加入web.config的<system.web>节:

<?xml version="1.0"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web> <caching>
<sqlCacheDependency enabled="true" pollTime="6000">
<databases>
<add name="codematic" connectionStringName="strcodematic" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
<connectionStrings>
<add name="strcodematic" connectionString="server=.;database=XLinShaWyDBase;uid=sa;pwd=123"/>
</connectionStrings>
</configuration>

  这里的connectionStringName指定了在<connectionStrings>中添加的某一个连接字符串。name则是为该SqlCacheDependency起的名字,这个名字将在第3步中用到。
  SqlCacheDependency类会自动完成对此配置节信息的读取以建立和数据库之间的联系。

  注意:在<databases>节的<add name="codematic" connectionStringName="strcodematic"/>中的name属性值必须和第三步的Page_Load代码中System.Web.Caching.SqlCacheDependency("codematic","dbo.Contact"); 中的第一个参数(数据库名称)相一致。
  第二步:执行下述命令,为 数据库启用缓存依赖。

  如果要配置SqlCacheDependency,则需要以命令行的方式执行。

  aspnet_regsql.exe工具位于Windows\\Microsoft.NET\\Framework\\[版本]文件夹中。

  如:(C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319)

  aspnet_regsql -C "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123" -ed -et -t "dbo.Contact"

  参数-C后面的字符串是连接字符串(请替换成自己所需要的值),

  参数-t后面的字符串是数据表的名字。

生产成功后,在对应的数据库,会多一个表dbo.AspNet_SqlCacheTablesForChangeNotification

select * from dbo.AspNet_SqlCacheTablesForChangeNotification

 注意:

  要使得7.0或者2000版本以上的SQLServer支持SqlCacheDependency特性,需要对数据库服务器执行相关的配置。

  有两种方法配置SQLServer:

  一使用aspnet_regsql命令行工具,

  二使用SqlCacheDependencyAdmin类。

  例如:

  aspnet_regsql -S "server"-E -d "database"–ed  或者

  aspnet_regsql -S "server"-E -d "database"-et -t "table"
  如果是Sql验证的话要把-E换成,-U (用户名),-P (密码)

  以下是该工具的命令参数说明:

  -? 显示该工具的帮助功能;

  -S 后接的参数为数据库服务器的名称或者IP地址;

  -U 后接的参数为数据库的登陆用户名;

  -P 后接的参数为数据库的登陆密码;

  -E 使用当前登录用户的 Windows 集成认证进行身份验证。

  -d 后接参数为对哪一个数据库采用SqlCacheDependency功能;

  -C 连接数据库的连接字符串。如果您指定服务器(-S)和登录(-U和-P,或 -E)信息,则此选项不是必需的,因为连接字符串已经包含这些信息。

  -t 后接参数为对哪一个表采用SqlCacheDependency功能;

  -ed 允许对数据库使用SqlCacheDependency功能;

  -dd 禁止对数据库采用SqlCacheDependency功能;

  -et 允许对数据表采用SqlCacheDependency功能;

  -dt 禁止对数据表采用SqlCacheDependency功能;

  -lt 列出当前数据库中有哪些表已经采用sqlcachedependency功能。

  第三步:在代码中使用缓存,并为其设置SqlCacheDependency依赖:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data; public partial class Default4 : System.Web.UI.Page
{
/// <summary>
/// 获取当前应用程序指定CacheKey的Cache对象值
/// </summary>
/// <param name="CacheKey">索引键值</param>
/// <returns>返回缓存对象</returns>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
} /// <summary>
/// 设置以缓存依赖的方式缓存数据
/// </summary>
/// <param name="CacheKey">索引键值</param>
/// <param name="objObject">缓存对象</param>
/// <param name="cacheDepen">依赖对象</param>
public static void SetCache(string CacheKey, object objObject, System.Web.Caching.CacheDependency dep)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(
CacheKey,
objObject,
dep,
System.Web.Caching.Cache.NoAbsoluteExpiration, //从不过期
System.Web.Caching.Cache.NoSlidingExpiration, //禁用可调过期
System.Web.Caching.CacheItemPriority.Default,
null);
}
protected void Page_Load(object sender, EventArgs e)
{
string CacheKey = "cachetest";
object objModel = GetCache(CacheKey);//从缓存中获取
if (objModel == null)//缓存里没有
{
objModel = GetData();//把当前时间进行缓存
if (objModel != null)
{
//依赖数据库codematic中的P_Product表变化 来更新缓存
System.Web.Caching.SqlCacheDependency dep = new System.Web.Caching.SqlCacheDependency("codematic", "dbo.Contact");
SetCache(CacheKey, objModel, dep);//写入缓存
}
}
GridView1.DataSource = (DataSet)objModel;
GridView1.DataBind();
}
private DataSet GetData()
{
string conString = "data source=.;initial catalog=XLinShaWyDBase;user id=sa;password=123"; string strSQL = "SELECT * FROM dbo.Contact";
SqlConnection myConnection = new SqlConnection(conString);
DataSet ds = new DataSet(); myConnection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(strSQL, myConnection); adapter.Fill(ds, "dbo.Contact");
myConnection.Close();
return ds;
} }

从以上代码可以看出,和文件依赖基本相同,只是在存放缓存SetCache时存入的依赖对象不同罢了。这里用的是SqlCacheDependency。

  其中,创建SqlCacheDependency的构造方法:

  public SqlCacheDependency(string databaseEntryName,string tableName)

  databaseEntryName :是在Web.config 文件的 caching 节的 sqlCacheDependency 的 databases 元素中定义的数据库的名称。

  tableName :与 SqlCacheDependency 关联的数据库表的名称。

  这样,只有当dbo.Contact表的内容发生变化时,查询操作才会重新查询数据更新缓存的内容,可以大大减少数据库的重复查询和提高系统的性能和运行效率。

 

Asp.net数据库缓存依赖的更多相关文章

  1. ASP.NET 数据库缓存依赖

    By Peter A. Bromberg, Ph.D. 在ASP.NET中,Cache类最酷的特点是它能根据各种依赖来良好的控制自己的行为.以文件为基础的依赖是最有用的,文件依赖项是通过使用 Cach ...

  2. (转)ASP.NET缓存全解析6:数据库缓存依赖

    ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...

  3. ASP.NET缓存全解析6:数据库缓存依赖 转自网络原文作者李天平

    更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据 ...

  4. Asp.net mvc+EF+Sql Server2008数据库缓存依赖

    1.开启数据库缓存依赖功能(开启对数据库中表Article和ArticleType的缓存) (注:)如果要配置SqlCacheDependency,则需要以命令行的方式执行. aspnet_regsq ...

  5. Asp.net文件缓存依赖

    Asp.net文件缓存依赖 using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  6. Yii2.0数据库缓存依赖发布的使用理解

    对于产品中经常需要生成一些缓存类的东西,比如系统基础配置,商品分类等,每次修改调整后都要手动进行缓存发布,是不是非常麻烦!这时候Yii2.0的缓存依赖发布就起到至关重要的作用了!现将主要的使用流程介绍 ...

  7. SqlCacheDependency:asp.net SQL缓存依赖

    先看下MSDN对此类的介绍: 在以下两者之间建立关系:一是在 ASP.NET 应用程序的 Cache 对象中存储的项:二是特定 SQL Server 数据库表或  SQL Server 2005 查询 ...

  8. c# 数据库缓存依赖

    1.为缓存依赖项启动通知数据库 在vs开发人员命令提示中运行(切换到aspnet_regsql.exe所在目录,示例目录:C:\Windows\Microsoft.NET\Framework64\v4 ...

  9. .net 缓存之数据库缓存依赖

    当监听的指定数据库内容某张表变化时就更新缓存 先来配置数据库,启动监听服务(SQL2008下) 执行如下语句: ALTER DATABASE OumindBlog SET NEW_BROKER WIT ...

随机推荐

  1. .NET中应用Ueditor(富文本编辑)的配置和使用

    一.Ueditor的下载 1.百度编辑器下载地址:http://ueditor.baidu.com/website/download.html 2.下载完整源码包,解压到任意目录,解压后的源码目录结构 ...

  2. 【Nutch2.2.1基础教程之1】nutch相关异常

    1.在任务一开始运行,注入Url时即出现以下错误. InjectorJob: Injecting urlDir: urls InjectorJob: Using class org.apache.go ...

  3. 微软企业库的Cache

    微软企业库的Cache 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSamp ...

  4. Java学习笔记--Swing用户界面组件

    很多与AWT类似. 事件处理参考:Java学习笔记--AWT事件处理 1.设计模式: 模型:存储内容视图:显示内容控制器:处理用户输入· 2. 文本输入常用组件 2.1 文本域: JLabel lab ...

  5. Windows10 Ubuntu子系统折腾

    UPDATE:(参考文章) 快速解决方案 使用cmder,设置startup参数为: %windir%\system32\bash.exe ~ 这样打开cmder就是默认进入bash了. ------ ...

  6. requestAnimationFrame动画方法

    一.动画方式 在HTML5/CSS3时代,实现动画的方式有许多种: 你可以用css3的animation和@keyframes: 可以用css3的transition: 还可以用原始的setTimeo ...

  7. 谈谈用SQLite和FMDB而不用Core Data

    谈谈用SQLite和FMDB而不用Core Data 发布于:2014-04-22 11:22阅读数:4235 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他 ...

  8. SIM卡基础,各管脚意义,封装定义

    1. SIM简介 SIM卡(Subscriber Identity Module).即用户识别模块,是一张符合GSM规范的"智慧卡".SIM卡可以插入任何一部符合GSM规范的移动电 ...

  9. VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结

    转帖:http://blog.csdn.net/whygosofar/article/details/2821875 MSDN中对于在不同的配置下Link的LIB作了说明: C Runtime Lib ...

  10. logstash 字段类型转换后 需要刷新

    filter { grok { match => [ "message" , "\s*%{IPORHOST:clientip}\s+\-\s+\-\s+\[%{HT ...