asp.net кеширует и перезапускает рабочие процессы - PullRequest
1 голос
/ 15 марта 2011

Итак, я заметил, что HttpContext.Cache очищается всякий раз, когда рабочий процесс перерабатывается.У меня есть обратный вызов, который повторно вставляет кэшированный элемент обратно в кэш всякий раз, когда он истекает.Однако, похоже, что это не происходит при перезапуске процесса.

В моем Application_Start есть вызов, который добавляет соответствующие элементы в Cache, но, кажется, он не вызывается после завершения рабочего процессапереработаны.Есть ли обратный вызов, который я могу использовать для повторного заполнения кэша при утилизации, или он должен быть Application_Start?Кроме того, как я могу проверить это локально?

Я вполне уверен, что я делаю что-то здесь не так.

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Рециркуляцию отработанного процесса можно рассматривать как остановку и запуск процесса, удерживающего .Net. Все данные AppDomain потеряны.

Насколько я понимаю, Application_Start выполняется только при поступлении первого запроса. Я ожидаю, что поведение будет таким же, даже после переработки.

Но если он не выполняется (интересно), вы всегда можете запустить его где-нибудь еще. Есть множество способов сделать это. Например, Application_BeginRequest или ctor любого статического класса, на который ссылаются при первой загрузке.

Обратите внимание, что HttpContext.Cache на самом деле является просто статическим объектом, поэтому вы можете просто иметь static bool isInitialized = false;, который вы измените после завершения init, и он будет храниться в запросах. С удачно расположенным lock() {} он должен работать без сбоев (поэтому два запроса не запускают две инициализации).

Я обычно решаю это кешировать по требованию. Не подходит для всех решений. Также я использую Enterprise Framework или AppFabric для установки тайм-аута (TTL) для кэша.

1 голос
/ 15 марта 2011

При перезапуске AppDomain все сборки выгружаются, и поэтому все данные очищаются.Когда приложение перезапускается, это, по сути, все равно, что начинать с нуля, и нет способа (насколько я знаю) переполнить кеш таким образом.

Это отличается от остановки и запуска приложения, которое в принципесохраняет состояние приложения, а при перезапуске восстанавливает его предыдущее состояние (включая кэш).

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

0 голосов
/ 19 января 2013

Перечисление CacheItemPriority имеет параметр "NotRemovable", который запрещает удаление элемента из кэша во время сбора мусора.

Из MSDN:

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

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