我的Outputcache属性高于ASP.NET MVC 3应用程序中的一个控制器操作:
[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 :(得分: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序列化对象。什么是昂贵的不是动作调用而是数据库调用。因此,只缓存此数据库调用的结果(使用ORMs缓存或系统缓存提供程序),因为这将为您提供对此缓存的到期策略的更强大的控制。