ASP.NET устанавливает зависимость кэша с помощью SqlCommand

Это эффективный способ установить элемент кеша в зависимости от запроса?

HttpRuntime.Cache.Insert(
                "ListLanguages",
                 list,
                 new SqlCacheDependency(command),
                 DateTime.UtcNow.AddMinutes(AppConfiguration.CacheExpiration.MinimumActivity),
                 Cache.NoSlidingExpiration);

команда представляет собой SqlCommand, инициализированный ранее как:

SqlCommand command = new SqlCommand("Listlanguages", connection);

где «ListLanguages» — это хранимая процедура, которая представляет собой просто выбор.

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

Что думают более опытные программисты?


person Fabio Milheiro    schedule 29.09.2009    source источник
comment
Как мы узнаем, что мы более опытны, чем вы? ;)   -  person AnthonyWJones    schedule 29.09.2009


Ответы (1)


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

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

Изменить

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

В более общем смысле я бы установил приемлемую задержку для получения актуальной информации и установил для нее абсолютный срок действия.

В случае дорогостоящих SQL-запросов я бы рассмотрел возможность размещения общих сводок в других таблицах и наличия кода, который обновляет эти данные (например, SP), корректирует или удаляет подготовленные данные.

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

Что такое "актуальные"?

В веб-приложении последняя информация, которую пользователь может увидеть, — это информация, предоставленная в последнем ответе. Вот некоторые вещи, которые следует учитывать.

  • Скажем, они что-то принесли, но их прерывает телефонный звонок на 5 минут. Насколько они осознают, что данные, на которые они возвращаются, были 5-минутной давности и теперь могут быть устаревшими?
  • Пользователь извлекает что-то всего за несколько миллисекунд до отправки данных, что может изменить то, что он увидит. Насколько это проблематично?
  • Кто-то вводит какие-то новые данные, но еще не отправил их, можно ли сказать, что текущие данные в базе данных сами по себе устарели?

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

Имея это в виду, во многих ситуациях, когда мы можем чувствовать себя обязанными предоставлять самую последнюю информацию, такое обязательство на самом деле не оправдано. Хорошим примером этого является сам SO. Многие результаты запросов, которые мы видим здесь, на самом деле кэшированы, и можно увидеть данные, которые не совсем соответствуют изменениям, которые, как мы знаем, мы сделали. Однако другие люди не знают о наших изменениях, и не так важно, чтобы они увидели их в ту же секунду, когда мы их внесли.

person AnthonyWJones    schedule 29.09.2009
comment
Ммм.. Ясно, но тогда как вы храните данные в кеше и представляете данные с достаточной уверенностью, что представленные данные обновляются? Например, если пользователь обновит свой профиль, я уверен, что он смутится, увидев, что он не был изменен :S - person Fabio Milheiro; 30.09.2009
comment
Энтони, мне любопытно, как ты справляешься со своими заботами и заботами. - person Fabio Milheiro; 01.10.2009
comment
Я согласен с Энтони... SqlCacheDependency сложно использовать. Также трудно понять, действительно ли он выполняет какое-либо кэширование или нет, потому что так много фактического поведения во время выполнения трудно предсказать. - person Stephen M. Redd; 07.10.2009
comment
Подскажите, пожалуйста, как вы работаете с этим вопросом? Используете ли вы какую-либо альтернативу кешу или просто не используете? Ваша помощь очень ценится! Спасибо - person Fabio Milheiro; 10.10.2009