2009-06-02 7 views
0

일부 비즈니스 개체를 캐시하는 ASP.NET 응용 프로그램이 있습니다. 새로운 객체가 저장되면, 객체를 삭제하기 위해 키의 remove를 호출합니다. 새 목록은 사용자가 다음에 데이터를 요청할 때 게으른로드되어야합니다.ASP.NET 캐시 - 제거 ("키")가 작동하지 않는 상황?

다른 클라이언트의 캐시보기가 서로 다른 점을 제외하고는 다른 점이 있습니다.

  • 두 사용자는 새로운 오브젝트가 사용자 1에 의해 저장되고 캐시가 사용자 1도
  • 사용자 2를 사용하는 데이터의 최신보기로 최대를보고
  • 제거 사이트
  • 을 탐색 할 수 있습니다 이 사이트는하지만, 사용자 1은 새로운 객체를 저장 한 후 어떤 이유로 새로운 캐시 된 데이터가 표시되지 않습니다 - 그들은 이전 목록을 계속 볼

이 코드의 단축 버전입니다 :

,536,
public static JobCollection JobList 
{ 
    get 
    { 
     if (HttpRuntime.Cache["JobList"] == null) 
     { 
       GetAndCacheJobList(); 
     } 
     return (JobCollection)HttpRuntime.Cache["JobList"]; 
    } 
} 

private static void GetAndCacheJobList() 
    { 
     using (DataContext context = new DataContext(ConnectionUtil.ConnectionString)) 
     { 
      var query = from j in context.JobEntities 
         select j; 
      JobCollection c = new JobCollection(); 
      foreach (JobEntity i in query) 
      { 
       Job newJob = new Job(); 
       .... 
       c.Add(newJob); 
      } 
      HttpRuntime.Cache.Insert("JobList", c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.Default, null); 
     } 
    } 

public static void SaveJob(Job job, IDbConnection connection) 
    { 
     using (DataContext context = new DataContext(connection)) 
     { 

       JobEntity ent = new JobEntity(); 
       ... 
       context.JobEntities.InsertOnSubmit(ent);     
       context.SubmitChanges(); 
       HttpRuntime.Cache.Remove("JobList");          

     } 
    } 

왜 이런 일이 일어날 지 모르는 사람이 있습니까?

편집 : 컨텍스트를 처리 중이지만 Linq2SQL을 사용하여 개체를 검색하고 있습니다.

답변

0

캐시 작업을 동기화하지 않기 때문입니다. 캐시에 목록을 쓰는 것을 잠그고 (아마도 잠금 안의 목록을 가져올 수도 있음) 캐시에서도 제거해야합니다. 그렇지 않으면 읽기와 쓰기가 동기화되어 있어도 Remove를 호출 한 직후에 이전 List를 저장하지 못하게 할 수 없습니다. 몇 가지 코드 예제가 필요한 경우 알려주십시오.

+0

캐시는 스레드 안전합니다. – fengd

0

보고있는 이전 데이터가 ViewState에 캐시되지 않았는지 확인합니다.

1

로드 균형 조정 용도로 여러 개의 프로덕션 서버가 없는지 확인해야합니다. 이 경우 캐시 항목을 무효화/제거하기위한 외부 종속성 아키텍처를 사용자에게 제공해야합니다.

0

사용자 2가 새 요청을 보냈는지 확인해야합니다. 어쩌면 본 내용은 브라우저의 캐시가 아니며 서버의 캐시가 아닙니다.