В прошлом я установил блокировку доступа к механизму HttpRuntime.Cache. Я не уверен, действительно ли я исследовал проблему в прошлом, и слепое окружение было заблокировано.
Считаете ли вы, что это действительно необходимо?
В прошлом я установил блокировку доступа к механизму HttpRuntime.Cache. Я не уверен, действительно ли я исследовал проблему в прошлом, и слепое окружение было заблокировано.
Считаете ли вы, что это действительно необходимо?
В этой статье предлагается использовать блокировку:
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;
}
}
}
Я не тестировал этот код, но мне было бы очень интересно услышать того, кто оценил этот подход в рабочей среде.
В соответствии с этой документацией http://msdn.microsoft.com/en-us/library/system.web.caching.cache(VS.80).aspx доступ к объекту кэша является потокобезопасным. Что касается объекта (ов), который вы храните в кеш-потоке, то безопасность должна происходить откуда-то еще.
Я не думаю, что необходимо обернуть доступ к свойству HttpRuntime.Cache с помощью блокировки, поскольку свойство .Cache является статическим, а также потокобезопасным.
Существует много разных способов доступа к объекту Cache (HttpRuntime.Cache, HttpContext.Current.Cache, Page.Cache и т.д.). Все они получают доступ к одному и тому же объекту Cache, так как там есть только один объект Cache для каждого домена приложения, так как он эффективно представляет потокобезопасный объект Singleton.
Я не думаю, что блокировка является ответом на проблему ниже, особенно в рабочей среде, где у вас несколько серверов, на которых запущено ваше приложение.
Проблема заключается в том, что если у вас есть запрос, который занимает 30 секунд, и вы выполняете страницу каждую секунду, то за время, необходимое для заполнения элемента кэша, поступит 29 других запросов, все из которых будут попытайтесь заполнить элемент кэша своими запросами в базе данных. Чтобы решить эту проблему, вы можете добавить блокировку потока, чтобы остановить выполнение других страниц при запросе данных из базы данных.