2011-12-24 4 views
0

У меня есть 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 с тем же параметром.

Если мы добавим новую компанию, как я могу заставить «перепроверять»?
Можно ли это сделать только для этого действия или мне нужно удалить весь кеш приложения?

Update: Моя база данных Oracle и мой ОРМ NHibernate

+0

Вы используете определенный ОРМ? –

+0

@sleimanjneidi, Обновлено. – gdoron

ответ

1

Вы можете использовать метод RemoveOutputCacheItem. Итак, давайте предположим, что вы назвали методом, как это, чтобы принести компании:

/somecontroller/getcompanyname/123 

Для того, чтобы истечь этот адрес из кэша, так что в следующий раз, когда он назвал ее получает свежие результаты:

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

Но IMHO для этого сценария было бы лучше использовать кеш второго уровня NHibernate для кэширования результатов вместо кэширования всего действия с помощью атрибута OutputCache. Все, что делает это действие, заключается в возврате сериализованного объекта JSON, который поступает из базы данных. Что дорого, это не вызов действия, а вызов базы данных. Поэтому кешируйте только результаты этого вызова базы данных (используя кеш ORMs или поставщиков системного кэша), поскольку это обеспечит вам более надежный контроль над политиками истечения срока действия этого кеша.

+0

Спасибо. можете ли вы привести пример использования кеша второго уровня NHibenate для этого сценария. – gdoron

+0

Если выход кэшируется в браузере клиента. он сохраняет HTTP-запрос, не так ли? – gdoron

+0

@gdoron, использование кэша второго уровня NHibernate, вероятно, заслуживает отдельного вопроса, поскольку оно не связано с asp.net-mvc. Что касается кэширования в клиентском браузере, да, он сохраняет HTTP-запрос. Но в вашем случае этот HTTP-запрос является самым дорогим по сравнению с извлечением данных из базы данных? Я думаю, вам придется выполнить некоторые тесты нагрузки в системе и сравнить результаты, чтобы узнать, что лучше для вашего точного сценария. –

Смежные вопросы