2011-12-24 3 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을 사용하고 있습니까? –

+0

@sleimanjneidi, 업데이트. – gdoron

답변

1

당신은 RemoveOutputCacheItem 방법을 사용할 수 있습니다. 그럼 당신이 회사를 가져 오기 위해이 같은 방법이라는 것을 가정하자 :

캐시에서이 URL을 만료하기 위해
/somecontroller/getcompanyname/123 

그것이라고 다음에 신선한 결과를 얻을 수 있도록 :

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

그러나 IMHO 경우 OutputCache 속성으로 전체 동작을 캐싱하는 대신 결과를 캐싱하기 위해 NHibernate의 2 차 수준 캐시를 사용하는 것이 좋습니다. 이 작업이 수행하는 모든 작업은 데이터베이스에서 제공된 JSON 직렬화 된 객체를 반환하는 것입니다. 비싼 것은 조치 호출이 아니라 데이터베이스 호출입니다. 따라서 ORMs 캐시 나 시스템 캐시 공급자를 사용하여이 데이터베이스 호출의 결과 만 캐시하면 캐시의 만료 정책을보다 강력하게 제어 할 수 있습니다.

+0

감사합니다. 이 시나리오에서 NHibernate의 2 차 수준 캐시를 사용하는 방법에 대한 예제를 제공해 주시겠습니까? – gdoron

+0

출력이 클라이언트 브라우저에 캐시 된 경우. HTTP 요청을 저장하지 않습니까? – gdoron

+0

@gdoron, NHibernate의 2 차 레벨 캐시 사용은 아마도 asp.net-mvc와 관련이 없으므로 별도의 질문을 할 가치가 있습니다. 클라이언트 브라우저에서 캐싱에 관한 한, 예, HTTP 요청을 저장합니다. 하지만 귀하의 경우에는이 HTTP 요청이 데이터베이스에서 데이터를 가져 오는 것과 비교할 때 가장 비싼 것입니까? 시스템에 대한 부하 테스트를 수행하고 결과를 비교하여 정확한 시나리오에 적합한지를 확인해야합니다. –

관련 문제