2009-06-02 4 views
0

У меня есть приложение ASP.NET, которое кэширует некоторые бизнес-объекты. Когда новый объект сохраняется, я вызываю удаление на ключ, чтобы очистить объекты. Новый список должен быть ленивым при загрузке в следующий раз, когда пользователь запросит данные.ASP.NET Cache - обстоятельства, при которых Remove («ключ») не работает?

За исключением проблем с различными видами кеша у разных клиентов.

  • Два пользователей просматривают сайт
  • Нового объект будет сохранен пользователем 1 и кэш удаляется
  • Пользователь 1 видит до даты представления данных
  • User 2 также использует сайт, но не по какой-то причине, увидеть новые кэшированные данные после того, как пользователь 1 накопил новый объект - они по-прежнему видеть старый список

Это сокращенный вариант кода:

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. Дайте мне знать, если вам нужен пример кода.

+0

Кэш - это потокобезопасный – fengd

0

Я бы также проверить, если вы еще этого не сделали, что старые данные, которые они видят, не были каким-то образом кэшированы в ViewState.

1

Я бы попросил вас убедиться, что у вас нет нескольких производственных серверов для целей балансировки нагрузки. В этом случае вам придется использовать некоторую внешнюю архитектуру зависимостей для недействительности/удаления элементов кэша.

0

Вы должны убедиться, что Пользователь 2 отправил новый запрос. Возможно, контент, который он видел, - это кеш браузера, а не кеш с вашего сервера.

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