Кажется, что почти каждый прочитанный мной учебник неправильно настроен SqlCacheDependency . Я полагаю, что они обычно смешивают устаревший метод опроса с методом уведомления о запросе.
Вот два из множества примеров:
На основании моего тестирования, если вы используете брокера (MSSQL 2015+), вам не нужно вносить какие-либо .config
изменения, а также не нужно делать какие-либо вызовы SqlCacheDependencyAdmin (не нужно определять таблицы и т. Д.) ).
Я упрощаю, просто сделай это ...
SqlDependency.Start(connString)
...
queryString = "SELECT ...";
cacheName = "SqlCache" + queryString.GetHashCode();
...
using (var connection = new SqlConnection(connString))
{
connection.Open();
var cmd = new SqlCommand(queryString, connection)
{
Notification = null,
NotificationAutoEnlist = true
};
var dependency = new SqlCacheDependency(cmd);
SqlDataReader reader = cmd.ExecuteReader();
try
{
while (reader.Read())
{
// Set the result you want to cache
data = ...
}
}
finally
{
reader.Close();
}
HostingEnvironment.Cache.Insert(cacheName, data, dependency);
}
(Код, который проверяет, является ли кеш нулевым или нет, не включен, так как это всего лишь настройка. Я просто хочу показать настройки кеша)
Кажется, это работает без необходимости определять, какие таблицы участвуют в запросе, и создавать сложные триггеры для каждой таблицы. Это просто работает.
Более удивительным для меня является то, что правила составления запроса имеют уведомление:
- Создание запроса на уведомление (Не могу найти документацию новее, чем 2008), похоже, не применяется. Я намерен сделать ТОП в моем SQL, и он все еще работает.
Для теста мне нужно 1000 раз выполнить запрос к таблице с именем «Настройки». Затем я обновляю значение в таблице и повторяю запрос.
Я наблюдаю за профилировщиком любых запросов, включающих слово «Настройки», и вижу, что запрос выполняется только 1 раз (для установки кэша), а затем выполняется оператор обновления, а затем запрос повторяется еще раз (кеш был признан недействительным, и запрос снова запустился)
Я беспокоюсь, что за 2-3 часа борьбы с правильным способом сделать это я что-то упускаю, и действительно ли это так просто?
Могу ли я просто поставить любой запрос, и он будет работать? Я ищу любые указатели, где я делаю что-то опасное / нестандартное, или мелкий шрифт, который мне не хватает