Подтвердить что ты не робот

Передовые методы HttpRuntime.Cache

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

Считаете ли вы, что это действительно необходимо?

4b9b3361

Ответ 1

В этой статье предлагается использовать блокировку:

http://msdn.microsoft.com/en-us/magazine/cc500561.aspx

Цитата:

Проблема в том, что если у вас есть запрос занимает 30 секунд, и вы выполнение страницы каждую секунду, в время, необходимое для заполнения кеш, 29 других запросов будут войдите, все из которых будут пытаться заполнить элемент кэша своими запросов к базе данных. Чтобы решить эту проблему проблемы, вы можете добавить блокировку потока для прекратите выполнение других страниц из запрашивая данные из базы данных.

Вот их фрагмент кода:

// check for cached results
object cachedResults = ctx.Cache["PersonList"];
ArrayList results = new ArrayList();

if  (cachedResults == null)
{
  // lock this section of the code
  // while we populate the list
  lock(lockObject)
  {
    cachedResults = ctx.Cache["PersonList"];
    // only populate if list was not populated by
    // another thread while this thread was waiting
    if (cachedResults == null)
    {
      cachedResults = ...
      ctx.Cache["PersonList"] = cachedResults;
    }
  }
}

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

Ответ 2

В соответствии с этой документацией http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx доступ к объекту кэша является потокобезопасным. Что касается объекта (ов), который вы храните в кеш-потоке, то безопасность должна происходить откуда-то еще.

Ответ 3

Я не думаю, что необходимо обернуть доступ к свойству HttpRuntime.Cache с помощью блокировки, поскольку свойство .Cache является статическим, а также потокобезопасным.

Существует много разных способов доступа к объекту Cache (HttpRuntime.Cache, HttpContext.Current.Cache, Page.Cache и т.д.). Все они получают доступ к одному и тому же объекту Cache, так как там есть только один объект Cache для каждого домена приложения, так как он эффективно представляет потокобезопасный объект Singleton.

Ответ 4

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

Проблема заключается в том, что если у вас есть запрос, который занимает 30 секунд, и вы выполняете страницу каждую секунду, то за время, необходимое для заполнения элемента кэша, поступит 29 других запросов, все из которых будут попытайтесь заполнить элемент кэша своими запросами в базе данных. Чтобы решить эту проблему, вы можете добавить блокировку потока, чтобы остановить выполнение других страниц при запросе данных из базы данных.