2011-12-24 92 views
0

我已经在上面的ASP.NET MVC 3应用程序我的控制器的一个动作的OutputCache属性:刷新旧的缓存数据

[OutputCache(Duration=86400)] // One day 
public JsonResult GetCompanyName(int companyId) 
{ 
    var company = _session.Get<Company>(companyId); 

    if (company == null) 
     throw new Exception(); 

    return Json(company.Name); 
} 

缓存背后的原因是我们所支持的企业不经常改变,所以我们不需要为具有相同参数的每个HttpRequest查询数据库。

如果我们添加一家新公司,我该如何强制“重新检查”?
只能对此操作执行操作吗,还是必须删除所有应用程序缓存?

更新:我的数据库是Oracle和我的ORM是NHibernate

+0

你使用的是某个ORM吗? – 2011-12-24 19:42:28

+0

@sleimanjneidi,更新。 – gdoron 2011-12-24 21:28:21

回答

1

你可以使用RemoveOutputCacheItem方法。因此,让我们假设你有人称这样的方法来获取企业:

/somecontroller/getcompanyname/123 

为了从缓存过期这个URL,以便下一次它被调用时都会得到新的结果:

public ActionResult Expire() 
{ 
    Response.RemoveOutputCacheItem("/somecontroller/getcompanyname/123"); 
    return Content("The cache was expired for the company with id = 123"); 
} 

但是,恕我直言,对于这种情况下,它会更好地使用NHibernate的二级缓存来缓存结果,而不是使用OutputCache属性缓存整个操作。该操作所做的只是返回来自数据库的JSON序列化对象。什么是昂贵的不是动作调用,而是数据库调用。因此,只需缓存此数据库调用的结果(使用您的ORM缓存或系统缓存提供程序),因为这将为您提供对此缓存的到期策略的更强大控制。

+0

谢谢。你能举个例子来说明如何在这种情况下使用NHibenate的二级缓存。 – gdoron 2011-12-26 20:36:27

+0

如果输出缓存在客户端浏览器上。它保存了HTTP请求,不是吗? – gdoron 2011-12-26 20:37:25

+0

@gdoron,NHibernate的二级缓存使用可能值得一个单独的问题,因为它与asp.net-mvc无关。就客户端浏览器的缓存而言,是的,它保存了HTTP请求。但在你的情况下,与从数据库获取数据相比,这个HTTP请求是最昂贵的事情?我想你将不得不在系统上做一些负载测试并比较结果,以便知道哪个更适合你的确切场景。 – 2011-12-26 22:08:44