ASP.NET Cache - обстоятельства, при которых Remove («ключ») не работает? - PullRequest
0 голосов
/ 03 июня 2009

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

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

  • Два пользователя просматривают сайт
  • Новый объект сохраняется пользователем 1, а кэш удаляется
  • Пользователь 1 видит актуальное представление данных
  • Пользователь 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 для получения объектов, хотя я избавляюсь от контекста.

Ответы [ 4 ]

1 голос
/ 08 декабря 2010

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

0 голосов
/ 08 декабря 2010

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

0 голосов
/ 09 июля 2009

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

0 голосов
/ 09 июля 2009

Это потому, что вы не синхронизируете операции кэширования. Вы должны заблокировать запись списка в кэш (возможно, даже получить список внутри блокировки) и удаление его из кэша. В противном случае, даже если чтение и запись синхронизированы, ничто не помешает сохранить старый список сразу после вашего вызова Remove. Дайте мне знать, если вам нужен пример кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...