Почему мои кэшированные данные исчезают? - PullRequest
2 голосов
/ 17 ноября 2011

Я создал метод WCF, который запускает бесконечный цикл, опрашивая каждые 5 минут. Он записывает в кеш 2 элемента: основной элемент, который я получаю, и LAST_POLLED. Это успешно вызывается при запуске приложения нашего веб-сайта:

//infinite loop
        while (true)
        {
            try
            {
                _cache.RefreshCache();
                WcfCache.SetCache(LAST_POLLED, DateTime.Now);
            }
            catch(Exception ex)
            {
                //logging exception to database
            }

            //essentially polling interval, though dependent on how long it takes to complete task
            Thread.Sleep(Polling_DELAY);
        }

Дата-время LAST_POLLED должна содержать время опроса. Тем не менее, иногда он хранится 1 января 0001 года. Я думаю, это должно быть из-за исчезновения кэша. Пул приложений для этого сайта WCF НЕ установлен на Recycle. NOR, если рабочие процессы отключены после простоя. Это будет работать несколько дней, но еще не работало целую неделю.

  1. Почему этот кеш сбрасывается?
  2. Есть ли лучший способ закодировать это? Я не хотел создавать отдельную службу Windows для этого, чтобы уменьшить количество проектов / приложений, но я могу.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

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

Для сохранения данных вы должны использовать хранилище данных. Хранилище данных может быть основано на sql (например, mysql) или даже на значении ключа (no-sql, например, membase). В этом случае они вам пригодятся.

Также кажется, что вы используете busy-wait . Это тоже не идеально .

Кстати, 01-01-0001 - это DateTime.MinValue .

Редактировать:

еще одна мысль # 1: вы также можете сохранять вещи в памяти вашей машины, например, используя статическую переменную. Он не будет ни сохранен, ни распространен, но может удовлетворить ваши потребности.

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

  1. Получить запрос на данные.
  2. Проверьте, находится ли он в кеше.
  3. Если так - верните его.
  4. Если нет - получить данные, кэшировать их, вернуть.
1 голос
/ 18 ноября 2011

Так как это приложение ASP.Net, существуют другие вещи, которые могут заставить IIS перезапустить ваше приложение и потерять кеш.

Наиболее вероятная возможность, помимо того, что вы уже упомянули, это что-то "касающееся" либо web.config, либо файлов в каталоге bin.Мы видели, как программы резервного копирования, антивирусные приложения и «полезные» пользователи так или иначе вызывают эту проблему.

Кроме того, не мешало бы проверить журналы событий, чтобы узнать, сообщает ли IIS о приложении.сбой в пуле приложений, что также может вызвать эту проблему.

0 голосов
/ 22 ноября 2011

Этот пост в блоге, хотя и не посвящен конкретно вашей теме, содержит полезную информацию о том, что может привести к повторному использованию пула приложений.

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

IIS сам перезапускает весь процесс w3wp.exe каждые 29 часов. Это будет просто поставить шапку в процесс w3wp.exe и сбить все домены приложения с ним.

Он также содержит некоторую информацию, которая может решить вашу проблему (HostingEnvironment.RegisterObject)

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