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

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

  实现步骤:

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

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

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

<?xml version="1.0"?>
<configuration>
<appSettings/>
<connectionStrings>
<add name="strcodematic" connectionString="data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="6000">
<databases>
 <add name="codematic" connectionStringName="strcodematic"/>
</databases>
</sqlCacheDependency>
</caching>
<compilation debug="true">
</compilation>
<authentication mode="Windows"/>
</system.web>
</configuration>

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

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

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

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

  aspnet_regsql -C "data source=127.0.0.1;initial catalog=codematic;user id=sa;password=" -ed -et -t "P_Product"

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

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

  运行结果如图15-3所示:

图15-3  启用数据库缓存依赖

  命令执行后,在指定的数据库中会多出一个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依赖:

///<summary>
/// 获取当前应用程序指定CacheKey的Cache对象值
///</summary>
///<param name="CacheKey">索引键值</param>
///<returns>返回缓存对象</returns>
publicstaticobject 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>
publicstaticvoid 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);
}
protectedvoid 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", "P_Product");
SetCache(CacheKey, objModel, dep);//写入缓存
}
} GridView1.DataSource = (DataSet)objModel;
GridView1.DataBind();
}
//查询数据
private DataSet GetData()
{
string conString ="data source=127.0.0.1;initial catalog=codematic;user id=sa;password=";
string strSQL ="SELECT * FROM P_Product";
SqlConnection myConnection =new SqlConnection(conString);
DataSet ds =new DataSet();
myConnection.Open();
SqlDataAdapter adapter =new SqlDataAdapter(strSQL, myConnection);
adapter.Fill(ds, "Product");
myConnection.Close();
return ds;
}

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

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

  public SqlCacheDependency(string databaseEntryName,string tableName)

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

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

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

ASP.NET MSSQL 依赖缓存设置方法的更多相关文章

  1. Asp.net禁用页面缓存的方法总结

    1.在Asp页面首部<head>加入 复制代码 代码如下:   Response.Buffer   =   True      Response.ExpiresAbsolute   =   ...

  2. Asp.net禁用页面缓存的方法

    方法1.在Asp页面首部<head>中添加如下代码 Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response ...

  3. Http请求头缓存设置方法

    1.直接在.aspx页面中设置最直接的,在.aspx页面中添加一行如下代码: <%@ OutputCache Duration="3600" VaryByParam=&quo ...

  4. asp.net中Session过期设置方法

    在Asp.net应用中,很多人会遇到Session过期设置有冲突.其中,可以有四处设置Session的过期时间: 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会 ...

  5. asp.net pagebase获取缓存的方法

    public string GetSysConfigByKey(string key) { if (object.Equals(HttpContext.Current.Cache["Cach ...

  6. Idea 软件Project项目的jar依赖关系设置方法

    1.查看所依赖的jar文件 (1)File--->Project Structure (2)Modules--->project01---->dependencies,可见所缺少的j ...

  7. asp.net mvc 依赖缓存启动项配置

    msdn 参考地址:https://msdn.microsoft.com/zh-cn/library/ms229862 4.5 第一步:32bit%windir%\Microsoft.NET\Fram ...

  8. ASP.NET 2.0缓存

    MSDN上缓存概述: http://msdn2.microsoft.com/zh-cn/library/726btaeh(VS.80).aspx 一.页输出缓存 1.设置 ASP.NET 页缓存的两种 ...

  9. 细说 ASP.NET控制HTTP缓存[转]

    阅读目录 开始 正常的HTTP请求过程 缓存页的请求过程 缓存页的服务端编程 什么是304应答? 如何编程实现304应答 如何避开HTTP缓存 在上篇博客[细说 ASP.NET Cache 及其高级用 ...

随机推荐

  1. Linux磁盘文件的命名

    磁盘的常用接口有两种:IDE和SATA接口,目前主流的是SATA接口. IDE接口由IDE扁平电缆线连接,一个电缆可连接两个IDE接口,通常主机又都会提供两个IDE接口,因此最多可以接到四个IDE设备 ...

  2. Prepared Java infrastructure for distributed scenarios

    code is sited on: https://github.com/zhoujiagen/javaiospike progress 2015/5/27 Nio/Nio2 examples, us ...

  3. H5标签-canvas实现颜色拾取功能

    HTML5 <canvas> 标签是用于绘制图像,不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器),必须使用脚本(通常是 JS)来完成实际的绘图任务. &l ...

  4. Selenium WebDriver对cookie进行处理绕过登录验证码

    现在几乎所有登录页面都会带一个验证码,做起自动化这块比较麻烦, 所以要绕过网站的验证码. 首先需要手动登录一次你的测试网站,去chrome的F12里获取这个网站的cookie信息,找到对应的保存登录信 ...

  5. 软件工程课程作业(三)--四则运算3(C++)

    伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思路 在此前程序拥有的功能:加减有无负数,除法有无余数以及算式可定制的功能的基础上,此次程序又添加了算式结果的 ...

  6. 当我把电脑500G硬盘格式化了的时候,在想些什么

    所以我就想重新尝试一下怎么装多系统,bootloader,MBR到底是怎么回事儿. 简要记录一下: 首先,在可以作为启动盘的U盘里面,备份一份可以用的WinXP镜像+校园网客户端安装文件+驱动精灵安装 ...

  7. java 日期格式 毫秒

    参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...

  8. JavaWeb学习记录(十九)——开发JSTL自定义标签

    一.防盗链标签 import javax.servlet.http.HttpServletResponse;import javax.servlet.jsp.JspException;import j ...

  9. Hibernate控制insert\update语句

  10. spark sql 访问hive数据时找不mysql的解决方法

    我尝试着在classpath中加n入mysql的驱动仍不行 解决方法:在启动的时候加入参数--driver-class中加入mysql 驱动 [hadoop@master spark-1.0.1-bi ...