Как синхронизировать чтения в реальном времени из таблицы сервера SQL - PullRequest
1 голос
/ 13 сентября 2011

У нас есть приложение для составления отчетов, которое должно обновлять свои диаграммы, когда данные записываются в соответствующую таблицу. (отчет основан только на одной таблице). В настоящее время мы просто сохраняем последнее чтение sessionid + rowid (уникальное комбо) в памяти, а таймер опроса просто делает выбор где rowid> что у нас в памяти (чтобы получить последние добавленные строки). Таймер запускается каждую секунду или около того, и быстрый читатель sql делает свою работу хорошо. Все идет нормально. Однако я чувствую, что это не оптимально, потому что иногда при записи данных возникают паузы из-за процесса по проекту. (пользователь нажимает кнопку паузы в системе, которая записывает данные ..). Тем временем наш таймер продолжает работать с БД и не получает новых строк. Никаких ошибок или чего-либо еще. Как эта ситуация нормально обрабатывается. Приложение, которое записывает данные, отделено от приложения для составления отчетов. 2 приложения работают на разных компьютерах. Итог: как получить данные в приложение c #, как и когда они записываются в таблицу сервера sql без необходимости опроса. спасибо

Ответы [ 4 ]

2 голосов
/ 13 сентября 2011

SQL Server имеет возможность уведомлять ожидающее приложение об изменениях, см. Таинственное уведомление . Вот как работает SqlDependency. Но это будет работать только до определенного порога скорости изменения данных. Если ваши данные изменяются слишком часто, то стоимость установки уведомления о запросе, который будет немедленно аннулирован при получении уведомления, слишком велика. Для действительно высоких конечных показателей изменений лучше всего уведомить приложение непосредственно от автора, что обычно достигается с помощью некоторых форм инфраструктуры pub-sub.

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

0 голосов
/ 13 сентября 2011

Если приложение для отчетов работает на одном сервере, приложение, которое записывает данные в SQL Server, также может отправлять в приложение для отчетов сообщение, информирующее о доступности новых данных.

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

0 голосов
/ 13 сентября 2011

К сожалению, единственный «правильный» способ - опрос, однако вы можете уменьшить стоимость этого опроса, заставив SQL ждать в цикле (убедитесь, что вы ожидаете WAITFOR примерно 30 мс на каждый проход цикла), пока не станут доступны данные (или наборпериод времени, например, 10 с).Это обычно используется при написании псевдо-очередей SQL.

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

0 голосов
/ 13 сентября 2011

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

Приложение должно будет прослушать сообщение.(вам нужно решить, что означает прослушивание - какой порт, какой протокол, какой формат и т. д.)

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

...