asp.net mvc3 简单缓存实现sql依赖
 

议题

随 着网站的发展,大量用户访问流行内容和动态内容,这两个方面的因素会增加平均的载入时间,给Web服务器和数据库服务器造成大量的请求压力。而大量的数据 请求就需要强大的数据库处理能力来支撑。改进更加只能的程序,以极少不必要的数据库访问或动态处理请求,可以节省添加更多服务器的费用以及显著提高Web 应用程序的整体速度。

解决方案

实现OutputCacheAttribute类,缓存不经常改变的数据或者相对固定的动作。

讨论

MVC3中实现缓存是非常容易的事情。将下面的属性添加在某个控制器的动作上即可完成:

[OutputCache (Duration=600)]

这个语句将自动缓存该视图600秒(或10分钟)共享给每个访问此页的用户。这就意味着针对代码进行简单的修改当你有1000名用户同时访问此页,只需要通过一次数据加载,可节约数以千计的数据库请求以及IIS处理负载。

输出缓存的属性看起来非常简单,但是当你打开引擎盖的时候,也可能会发现这辆车的引擎原来如此复杂。当然除非你原本就是名机械师。这个属性提供了很多关于缓存的方式,必须持续缓存时间,甚至还添加了SQL依赖,在这个秘诀中我们会深入探讨一番。

按照时间缓存非常简单,你只需要告诉MVC视 图应该被缓存多少秒即可。至于缓存存储的位置,是客户端浏览器还是服务器或者是它们的组合,这个问题稍微有点复杂。一个好的做法是首先分析被缓存的内容数 据,如果是缓存多个用户共享的数据,缓存到服务器上更为合适;然而如果是个人数据,比如个人定制的网页,还是将其缓存在用户的浏览器中更好。虽然缓存可以 说是个伟大的发明,但是它也是有局限性的。通常情况下,缓存的最大限制是内存,不是一切都可以缓存在服务器上。

然 而,最有趣的方式还是SQL依赖。OutputCache允许数据一直被缓存,直到它在数据中的内容发生了实际的变化,这是一个非常有用的功能。就拿图书 来举例,新书并不是经常增加的,因此可以为图书设置一个缓存时间(例如24小时)。但是,如果在缓存过期之前添加了一本新书,又或者是在漫长的一周或几天 里根本就没有添加新书?第一种情况,添加一本新书不能及时出现,用户是会不高兴的。而第二种情况,因为没有新书被添加,每天都要发起不必要的服务器请求。 使用SQL依赖的方式,像我们希望的那样,当图书的表发生变化时缓存能被立即更新。

这是一个非常棒的功能,在其他编程语言中,你需要手动控制缓存,你需要自己手动更新无效缓存。相信我,这很容易就会让你错过一两个应该正常清除的缓存。

在 接下来的示例中,将缓存图书列表页面。默认情况下,如果没有设置VaryByParam的值,MVC3将会自动创建一个唯一的缓存对象。这是个相当棒的功 能,按二在这本书上面的例子里,搜索关键字也会作为输入参数之一,但是可能输入数以百计不同的关键字组合,所以这个变量不应该被缓存(这就是上面提高的会 产生内存警告的问题)。下面修改后启用缓存的BooksController控制器:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Dynamic;
using System.Web;
using System.Web.Mvc;
using MvcApplication4.Models;
using MvcApplication4.Utils;
using PagedList;
namespace MvcApplication4.Controllers
{
public class BooksController : Controller
{
private BookDBContext db = new BookDBContext();
//// GET: /Books/ [OutputCache(Duration=600, VaryByParam=
"sortOrder;filter;page")]
public ViewResult Index(string sortOrder,
string filter, string Keyword, int page = 1)
{
...
return View(books.ToPagedList(currentPage,
maxRecords));
}
...
} }

这段代码是非常不错的缓存方案,可以立即降低服务器负载。接下来,将这个例子扩展为SQL依赖,在开始工作之前必须还要做一些设置工作。首先是修改Web.config,在文件中定义一个数据库链接,然后,将缓存部分的SQL依赖设置如下:

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="ApplicationServices" connectionString=
"data source=.\SQLEXPRESS;Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient"/>
<add name="BooksDBContext" connectionString=
"Server=.\SQLEXPRESS;Database=
MvcApplication4.Models.BookDBContext;
Trusted_Connection=true" providerName=
"System.Data.SqlClient" />
</connectionStrings>
...
<system.web>
<caching>
<sqlCacheDependency enabled="true" pollTime="2000">
<databases>
<add name = "MvcApplication4.Models.BookDBContext"
connectionStringName = "BooksDBContext"/>
</databases>
</sqlCacheDependency>
</caching>
...
</system.web>
...
</configuration>

在上面的例子中,将pollTime设置为2000毫秒,也就是说,每2秒中,就会查询一次缓存数据库是否被更改,这个变量设置可以根据你的实际需求来修改。

现在,需要修改Global.asax.cs文件,必须在Application_Start方法中通过SqlCacheDependencyAdmin类的EnableTableForNotifications方法为每个需要缓存的表添加监听功能。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication4.Models;
using System.Data.Entity;
using System.Globalization;
using System.Threading;
using MvcApplication4.Utils; namespace MvcApplication4
{
public class MvcApplication : System.Web.HttpApplication
{
...
protected void Application_Start()
{
Database.SetInitializer<BookDBContext>(
new BookInitializer()); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); String connectionString =
System.Configuration.ConfigurationManager.ConnectionStrings
["BooksDBContext"].ConnectionString; System.Web.Caching.SqlCacheDependencyAdmin.
EnableNotifications(connectionString); System.Web.Caching.SqlCacheDependencyAdmin.
EnableTableForNotifications(connectionString, "books");
}
...
} }

在命令行窗口中,执行如下步骤来完成SQL通知的功能配置工作:

点击“开始”按钮 -> 选择“运行”

输入“cmd”并回车

cd %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regsql.exe -S .\SQLEXPRESS -ed-dMvcApplication4.Models.BookDBContext -et -t books -E

务必要你自己的信息,替换命令中的服务器名、数据库名以及表名。此外,如果你的数据库包含用户名和密码,将需要包含额外的输入参数(-U和-P)。命令运行后,应该会显示两条成功信息,第一条,说明数据库缓存功能启用;第二条说明指定表缓存成功。

最后,使用SQL依赖缓存需要对BooksController稍作修改。此外,因为更换应用程序缓存方式,之前设置的缓存持续时间需要修改为Int32的最大值。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Dynamic;
using System.Web;
using System.Web.Mvc;
using MvcApplication4.Models;
using MvcApplication4.Utils;
using PagedList; namespace MvcApplication4.Controllers
{
public class BooksController : Controller
{
private BookDBContext db = new BookDBContext();
//// GET: /Books/ [OutputCache(Duration=Int32.MaxValue, SqlDependency =
"MvcApplication4.Models.BookDBContext:books",
VaryByParam="sortOrder,filter,page")]
public ViewResult Index(string sortOrder, string filter,
string Keyword, int page = 1)
{
...
return View(books.ToPagedList(currentPage,
maxRecords));
}
...
}
}

在 以前的MVC版本中,是不支持局部缓存的,这就意味着每次都需要将整个动作的结果进行缓存。目前在MVC3版本中开始支持局部缓存。实现这个功能,需要创 建一个类似于秘诀1.14中使用Ajax提交表单的自动作。在BookCommentsController的这两个活动都至返回分部视图,而都无需缓存 父级动作中的缓存内容。这是一个非常棒的改进,可以将你的代码与那些不经常改变的缓存内容进行有效的隔离。

原文链接:http://www.uol123.com/2012/05/07/asp-net-mvc3-%E7%AE%80%E5%8D%95%E7%BC%93%E5%AD%98%E5%AE%9E%E7%8E%B0sql%E4%BE%9D%E8%B5%96.html

【转】asp.net mvc3 简单缓存实现sql依赖的更多相关文章

  1. Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  2. [MVC.NET] Asp.Net MVC3 简单入门第一季

    转自:http://www.cnblogs.com/fly_dragon/archive/2011/10/12/2208042.html 初识Asp.Net MVC2.0 初识Asp.Net MVC2 ...

  3. Asp.Net MVC3 简单教程(三)详解Controller之Filter 【转】

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  4. Asp.Net MVC3 简单入门详解过滤器Filter(转)

    前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...

  5. Asp.Net MVC3 简单入门详解过滤器Filter

    http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MV ...

  6. 【转】Asp.Net MVC3 简单入门详解过滤器Filter

    原文地址:http://www.cnblogs.com/boruipower/archive/2012/11/18/2775924.html 前言 在开发大项目的时候总会有相关的AOP面向切面编程的组 ...

  7. Asp.Net MVC3 简单入门详解过滤器Filter(转载)

    前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...

  8. 【ASP.Net MVC3 】使用Unity 实现依赖注入

    转载于:http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html 家人身体不太好,好几天没在园子里发帖了. 新项目还是要用M ...

  9. ASP.NET MVC3使用Unity2.0实现依赖注入(转载和扩展)

    http://note.youdao.com/share/?id=53252d0f897e0e109aadd296a1682354&type=note

随机推荐

  1. NDK debug模式

    NDK默认是使用NDEBUG宏的,assert也默认不生效,若要开启assert,按以下步骤: 1.編譯NDK代碼時,後面加上NDK_DEBUG=1 ,如: ndk-build NDK_BUILD=1 ...

  2. Quartz.Net实现定时任务调度

    Quartz.Net介绍: Quartz一个开源的作业调度框架,OpenSymphony的开源项目.Quartz.Net 是Quartz的C#移植版本. 它一些很好的特性: 1:支持集群,作业分组,作 ...

  3. 为什么Wireshark无法解密HTTPS数据

    为什么Wireshark无法解密HTTPS数据 导读 由于需要定位一个问题,在服务器上tcpdump抓取https数据包,然后下载到本地打开wireshark分析.然后我们下载域名私钥配置到wires ...

  4. 讲讲你不知道的 ARC (一)

    来源:伯乐在线 - 酷酷的哀殿 链接:http://ios.jobbole.com/89420/ 点击 → 申请加入伯乐在线专栏作者 内容提要 通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制 ...

  5. IIS 之 HTTP 错误 500.19(无法访问请求页面,因为该页的相关配置数据无效)

    HTTP 错误 500.19- Internal Server Error 错误解决方法,碰到这个问题的原因有很多,大家可以参考下,看属于哪种情况. 刚在本机部署了一个WebService测试,浏览的 ...

  6. 1.4 Documents,Fields和Schema设计--目录

    1.4.1.Documents,Fields和Schema概述 1.4.2 solr字段类型 1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性 1.4.2 solr字段类型 ...

  7. Java基础知识强化106:Java中 int 的各进制之间的转换

    1.二.八.十.十六进制之间的转换  下面是示例代码,我们直接通过JDK工具库中的方法实现的,如下: public static Integer valueOf(String s, int radix ...

  8. Android(java)学习笔记263:Android下的属性动画(Property Animation)

    1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...

  9. http请求数据

    /// <summary>        /// http请求post数据        /// </summary>        /// <param name=&q ...

  10. mac下为Apache 创建 .htaccess文件

    标签:mac   .htaccess 在设置固定链接时会提示如下的问题:   若您的 .htaccess 文件可写,我们可以自动修改它.但似乎它不可写,因此我们在下方列出了您 .htaccess 文件 ...