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" - это хранимая процедура, которая является просто выбором.
Я считаю этот метод более простым и более надежным, чем зависимость агрегированного кэша (я имею в виду отказоустойчивость, потому что мне не нужно самостоятельно агрегировать таблицы!:).
Что думают более опытные программисты?
1 ответ
Я не думаю, что вам нужно использовать хранимую процедуру, команда может основываться на операторе select, который содержится внутри нее.
Лично я избегаю SqlCacheDependency, меня всегда беспокоит, что в запросе может быть просто что-то, с чем не справляется брокерская система, на которой он основан, и я не всегда могу вспомнить, что это такое. Это также кажется слишком сложным, так что я волнуюсь, что это может быть хрупкой стороной.
редактировать
В конкретном случае, когда пользователь обновляет свой профиль, у меня будет код, который обновляет профиль, удаляя кэшированную копию.
В более общем смысле я бы установил приемлемую задержку для получения актуальной информации и установил бы абсолютное истечение этого срока.
В случае дорогостоящих SQL-запросов я хотел бы рассмотреть возможность размещения общих сводок в других таблицах и иметь код, который обновляет эти данные (например, SP), корректировать или удалять промежуточные данные.
Я не говорю, что никогда бы не использовал SqlCacheDepencency, но до сих пор я не сталкивался со сценарием, где это единственный разумный вариант, хотя я уверен, что они существуют. Я предполагаю, что такие сценарии могут возникнуть, когда вы не полностью контролируете весь код, который может изменить базу данных.
Что такое "современное" в любом случае?
В веб-приложении последняя информация, которую пользователь может увидеть, предоставлена в последнем ответе. Вот несколько вещей для рассмотрения.
- Скажем, они что-то получили, но затем прервали телефонным звонком на 5 минут. Насколько они осознают, что данные, к которым они возвращаются, имеют возраст 5 минут и могут устареть?
- Пользователь получает что-то за несколько миллисекунд до отправки данных, что изменит то, что он увидел бы, насколько это проблема?
- Кто-то вводит новые данные, но еще не представил их, можно ли сказать, что текущие данные в базе данных сами по себе устарели?
Суть, к которой я привожу, заключается в том, что независимо от того, насколько умная кэш-память мы вкладываем в системы, это неизбежная задержка, и что мы принимаем такую задержку, не задумываясь об этом.
Имея это в виду во многих ситуациях, когда мы чувствуем себя обязанными предоставлять самую свежую информацию, такое обязательство на самом деле не гарантируется. Хорошим примером этого является сама ТАК. Многие из результатов запроса, которые мы видим здесь, на самом деле кэшируются, и можно увидеть данные, которые не совсем соответствуют изменениям, которые, как мы знаем, мы сделали. Однако другие люди не знают о наших изменениях, и не важно, что они видят их в ту же секунду, как мы их сделали.