HttpRuntime.Cache [] vs Application [] - PullRequest
29 голосов
/ 29 ноября 2008

Я знаю, что большинство людей рекомендуют использовать HttpRuntime.Cache, потому что он обладает большей гибкостью ... и т. Д. Но что, если вы хотите, чтобы объект сохранялся в кеше в течение всего срока службы приложения? Есть ли большой недостаток в использовании объекта Application [] для кеширования вещей?

Ответы [ 3 ]

19 голосов
/ 29 ноября 2008

Пока вы не злоупотребляете состоянием приложения, я не вижу проблем в использовании его для элементов, срок действия которых вы не хотите истекать. В качестве альтернативы я бы, вероятно, использовал статическую переменную рядом с кодом, который ее использует. Таким образом, вы избегаете прохода через HttpApplicationState, а затем получаете ссылку на System.Web, если я хочу получить доступ к своим данным.

Но не забудьте продумать, как вы используете объект (ы), который вы храните в HttpApplicationState. Если это DataSet, к которому вы продолжаете добавлять материал для каждого запроса, то в какой-то момент вы в конечном итоге потребляете слишком много памяти на веб-сервере. То же самое может произойти, если вы продолжите добавлять элементы в HttpApplicationState при обработке запросов, в какой-то момент вы заставите приложение перезапуститься.

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

18 голосов
/ 28 января 2009

Приложение не поддерживается Cache. Если вам нужно что-то с областью применения, то вы должны либо создать его как статический член класса, либо использовать Cache. Если вы хотите пойти по пути Cache, но не хотите, чтобы срок его действия истек, вы должны использовать опцию CacheItemPriority.NotRemovable при вставке значения в кэш. Обратите внимание, что можно использовать этот приоритет и при этом использовать зависимости кеша, например, если ваши данные зависели от чего-то в файловой системе. Все, что делает CacheItemPriority, - это предотвращает интеллектуальную очистку элемента HttpRuntime.Cache, когда он ощущает нехватку памяти, и использует алгоритм наименьшего количества недавно использованных для очистки элементов, которые не пользуются большой популярностью.

7 голосов
/ 29 ноября 2008

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

...