#c# #.net #caching #sqldependency #notificationservices
#c# #.net #кэширование #sqldependency #службы уведомлений
Вопрос:
Я использую SqlDependency для отслеживания изменений в базе данных. Допустим, это биржевые котировки, чтобы сделать пример более понятным. Приложение также использует (другой) SqlDependeny-объект для отслеживания изменений статических данных, которые кэшируются в приложении.
Что я делаю, так это запускаю зависимость с помощью SqlDependency.Start()
при запуске приложения и вызываю SqlDependeny.Stop
при закрытии приложения. Пока все работает хорошо.
Теперь, когда пользователь выбирает биржевой символ, настраивается другая SqlDependency и уведомляет меня об изменениях, по которым я могу предпринять действия. Когда пользователь изменяет символ, который он хочет отслеживать, я должен настроить новую SqlDependency и должен был бы очистить старую SqlDependency.
Мой вопрос: это правда? И как я могу очистить определенные зависимости? SqlDependency.Stop()
это статический метод, который останавливает все зависимости — и даже там я совершенно не уверен, действительно ли подписки на уведомления на сервере SQL удалены — или просто ждут истечения тайм-аута.
Все это поднимает вопрос, правильно ли использовать SqlDependency для выполнения некоторого кэширования, или есть другие хорошие и простые методы для достижения этого?
Ответ №1:
Не уверен, зачем вам нужно вызывать Stop
здесь. Просто создайте новый SqlDependency
экземпляр для нового символа и удалите ссылку на экземпляр для старого, что позволит сборке мусора вовремя его очистить. При условии, что вы также удалите свою подписку на OnChange
событие старого экземпляра, этот подход должен сработать для вас.
Не уверен, как это будет масштабироваться, если вы хотите поддерживать много пользователей. В этом случае централизованное обнаружение изменений в кэше и схема слияния могли бы быть лучше.
Комментарии:
1. Привет, Стив, спасибо за твой ответ! С чего обычно начинается создание механизма централизованного обнаружения изменений в кэше? Возможно, с помощью брокера на сервере sql, который отправляет сообщения приложениям, как только наблюдаемые изменения данных (подписки на уведомления)? Было бы здорово, если бы вы могли указать мне на пример или URL, где я могу найти больше об этой практике. Большое вам спасибо!
2. Я проводил некоторое тестирование памяти и не нашел никаких причин для удаления старого обработчика событий onChange.