Как SqlCacheDependency узнает, когда следует общаться с любым слушателем, когда данные в таблице изменяются? - PullRequest
7 голосов
/ 08 сентября 2011

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

1) Компонент Service Broker должен быть включен в базе данных и должны быть установлены некоторые разрешения.

2) Схема базы данных должна быть развернута.

3) Используя aspnet_regsql.exe, включите зависимость кэша sql для базы данных и таблиц, для которых необходимо кэшировать данные (на этом шаге создается таблица для отслеживания изменений и триггеры в таблицах для сбора изменений и увеличения значения в этой таблице) .

4) Установите зависимость кэша sql в приложении .net. Например, в веб-приложении вам необходимо добавить значения конфигурации для времени опроса, строки подключения и т. Д .; запустите / остановите зависимость в вашем global.asax.cs, а затем добавьте зависимости кеша sql при добавлении элементов в кеш.

4a) Часть того, что происходит при запуске зависимости, состоит в том, что инфраструктура настроена для очереди, службы и элемента обработки для последующего взаимодействия и очистки. Используя Sql Query Profiler, вы можете видеть, как установлено соединение и в службе настроен канал связи, чтобы приложение получало сообщения с сервера sql.

5) Вот где я запутался. На данный момент я кэшировал элемент в кэше моего приложения со ссылкой на зависимость кэша sql от базовой таблицы, чтобы мое приложение могло получать изменения в случае изменения этой строки. Если я вручную запускаю обновление для этой строки, я вижу, что срабатывает триггер, а значение в таблице отслеживания увеличивается на 1. Однако я не вижу никаких сообщений, возвращающихся в приложение, ничего в профилировщике запросов sql, ни элемент удален из кеша Я также не вижу ничего в очередях базы данных (ни динамическая очередь приложений, ни стандартные очереди ошибок / передач)

У меня вопрос: что наблюдает за этой таблицей отслеживания в базе данных, чтобы можно было отправлять сообщения обратно в зависимости sql, которые касаются изменений в этих данных?

Любая помощь очень ценится ... Я просматривал множество онлайн-ссылок и не могу найти конкретного объяснения этому.

1 Ответ

5 голосов
/ 08 сентября 2011

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

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

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

+Table Name + ChangeNumber +
| Product   | 1            |
+-----------+--------------+
| User      | 1            |
+-----------+--------------+

Теперь, если вы измените что-либо в любой из этих таблиц, триггер будет увеличивать ChangeNumber, и теперь мы знаем, что они изменились.

Очевидно, что это еще не все, но это общая идея.

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

...