Является ли таймер хорошим решением для этого? - PullRequest
1 голос
/ 09 июня 2010

У меня есть приложение, которое использует базу данных MSSQL.Приложение имеет модуль, который используется для отправки сообщений между пользователями приложения.Когда один пользователь отправляет сообщение другому, я вставляю сообщение в базу данных и устанавливаю статус сообщения на 1 (после того, как пользователь прочитал базу данных сообщений, я обновляю и устанавливаю статус сообщения на 0).

Теперь я использую system.timers.таймер для проверки статуса сообщения, и если статус сообщения 1, пользователь получает уведомление о том, что у него есть одно входящее сообщение.

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

Есть ли другое решение для этого без таймера запуска?

Спасибо!

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Я не думаю, что решение, использующее таймер, который выполняет опрос, это плохо.А 50 пользователей - это относительно мало.

Каждый пользователь запускает клиентское приложение, которое напрямую подключается к базе данных?Или это приложение ASP.NET?Или сервис, который подключается к БД и уведомляет клиентские приложения?

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

Другие опции

  1. Использовать SqlDependency / Query уведомления MSDN
  2. Только если ваша логика обработки сообщений становится большесложный, наверное, взгляните на сервисного брокера.Особенно, если вам нужно поведение в очереди.Но, как кажется, это было бы слишком сложно.

Я бы не использовал триггер.

0 голосов
/ 09 июня 2010

Если вы всегда проверяете таблицу сообщений, вы можете добавить в свою таблицу пользователей столбец с именем: HasNewMessage, который обновляется триггером в таблице сообщений

Чтобы проиллюстрировать это:

Пользователь 1 получает новое сообщение. Триггер Messagetable устанавливает HasNewMessage на 1 для user1

. Затем каждые 5 минут вы проверяете, имеет ли user1 HasNewMessage (должно быть быстрее из-за индексированной пользовательской таблицы)

Если user1 просматривает егопочтовый ящик, для которого вы установили HasNewMessages обратно в 0

Надеюсь, это поможет

0 голосов
/ 09 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...