SqlDependency теряет подписку с течением времени

Я использую SqlDependency в приложении .NET 3.5 более 3 лет без каких-либо проблем. Сценарий следующий:

  1. Центральная служба Windows с SqlDependency просмотр таблицы (назовем ее Таблица A)
  2. Несколько пользователей используют приложение WPF с уникальным SqlDependency для каждого пользователя, просматривающего таблицу (снова таблица A)
  3. Пользователь ставит в очередь единицу работы для обработки в таблице A.
  4. SqlDependency срабатывает на службе окон
  5. Служба Windows обрабатывает все незавершенные элементы в таблице A и сохраняет результаты в таблице A.
  6. Уникальные срабатывания SqlDependency для каждого пользователя, чьи результаты доступны
  7. Пользователь обрабатывает свою работу

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

Увидев такое поведение, я решил запустить профилировщик на сервере SQL для захвата событий подписки. Из полученных данных я заметил, что иногда подписка регистрируется (с уникальным идентификатором) одним пользователем, но затем активируется (с тем же уникальным идентификатором) другим пользователем. Обычно это происходит с упомянутой выше службой и одним или несколькими пользователями приложения WPF. (Я приложил скриншот проблемы в результатах профайлера)

Это ожидаемое поведение? Что уведомление может быть запущено для другого пользователя, чем оно было зарегистрировано? Указывает ли это на проблему на прикладном уровне? Любая помощь приветствуется.

Profiler  Результаты


person Michael Bowersox    schedule 30.10.2013    source источник
comment
Хотел добавить комментарий... Я открыл тикет с поддержкой Microsoft, и они сказали мне, что данные, которые я вижу в профилировщике SQL, верны. В трассировке мы видим, что подписка была запущена другим пользователем, а не созданным. Это ожидаемое поведение, поскольку это пользователь, выполнивший запрос, который активировал подписку, а не пользователь, для которого была активирована подписка.   -  person Michael Bowersox    schedule 27.11.2013
comment
Так это решило вашу проблему? Мы собираемся впервые использовать SqlDependency в этом же поместье в .net 4.5, поэтому я изучаю его.   -  person Johnathon Sullinger    schedule 01.07.2015
comment
Включен ли брокер для вашей базы данных? Правильно ли настроены и очередь, и служба для вашей базы данных? Есть ли у пользователя вашей службы и целевых клиентов достаточно прав для получения уведомлений?   -  person Hesham    schedule 14.01.2016
comment
Может показаться глупым, но пробовали ли вы останавливать и запускать сервис-брокер?   -  person Balah    schedule 23.01.2016
comment
Длинный выстрел, но что, если служба, о которой вы говорите, выйдет из строя и перезапустится? Это как-то объясняет поведение?   -  person ikwillem    schedule 18.02.2016
comment
Как правило, я избегаю использования одной подписки на дизайн пользователя. У меня не было вашей конкретной проблемы, но Microsoft предостерегает от слишком большого количества слушателей, не определяя слишком много.   -  person Jonathan Allen    schedule 05.03.2016


Ответы (1)


Поскольку создается несколько экземпляров SqlDependency, я бы проверил наличие повторяющихся подписок, как указано здесь. Подписки могут считаться дубликатами в зависимости от вашей конфигурации. Поведение «означает, что если уведомление запрашивается для идентичных запросов, отправляется только одно уведомление».

Еще одна вещь, которую нужно проверить, это может ли событие OnChange действительно работать, но не отображаться так из-за того, что оно срабатывает в другом потоке. Отмечен многопоточный характер SqlDependency здесь.

Трассировка Profiler указывает на то, что Service Broker выполняет свою работу. Добавление дополнительной трассировки на уровнях .NET покажет, срабатывает ли подписка на уровне базы данных, но не приведет к срабатыванию события OnChange. Дополнительные советы по устранению неполадок можно найти здесь.

person Christopher J. Grace    schedule 05.03.2016