Сохранять статические данные через AppPool - PullRequest
3 голосов
/ 07 июня 2011

Я создал приложение ASP .Net MVC 3, которое позволяет пользователям осуществлять поиск по различным медиа-файлам на основе их имен файлов.Этих файлов много, поэтому я создал инвертированный индекс, который храню в памяти.В частности, я описываю это как

Dictionary<string,List<string>>. 

. Ну, этот индекс должен быть сначала создан, чтобы его можно было искать, поэтому я создал метод для его построения.Работает нормально, все отлично, но, естественно, каждый раз, когда обновляется AppPool, мой индекс теряется.Я пытался отключить утилизацию AppPool, но я предполагаю, что это плохая идея (и, похоже, она перерабатывается независимо).

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

Cheers, -Josh

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Думаю, ответ Майка близок, но не идеален.Проблема в том, что событие запуска приложения срабатывает только один раз при запуске самого сервера;он не срабатывает каждый раз при повторном использовании пула приложений.Я пытался сделать именно эту вещь, чтобы сериализовать некоторые данные на диск до того, как пул был перезапущен, и прочитать их позже (то есть сохранить их в базе данных). Я обнаружил, что событие запуска приложения никогда не запускалось после рециркуляции пула, поэтому мойданные никогда не возвращались обратно. Я не смог найти событие, которое сработало после перезагрузки пула приложений, поэтому я был вынужден прочитать эти данные обратно в конструкторе объекта, который будет содержать эти данные.Он работает, но оставляет данные на диске дольше, чем мне удобно.

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

2 голосов
/ 07 июня 2011

Предполагая, что индекс доступен для него, я бы подумал, что вы могли бы сериализовать индекс для Application_disposed и затем десериализовать его в событии application_start в глобальном asax?

0 голосов
/ 07 июня 2011

Если вам нужно постоянное хранилище ключей / значений, я бы предложил что-то вроде Redis .Я успешно пользовался этим продуктом в условиях чрезвычайно большого объема (более 500 миллионов транзакций в час).

...