Подтвердить что ты не робот

Я хочу, чтобы моя база данных (SQL) уведомляла или нажимала обновления для клиентского приложения

Я разрабатывал это приложение на VB.net 2010 и SQL 2008.
Я хотел, чтобы клиенты были уведомлены о обновлениях на db и приложение, используемое для проверки db для изменений в указанную минуту с использованием таймера, который действительно неэффективен. Я читал о query notification, sqldependency, service broker, но затем я прочитал что-то, что сказал, что они могут быть неэффективными, если у меня есть 100 клиентов, и я использую уведомления о запросах для отправки уведомлений в свое приложение. Кто-то поможет мне в том, что я должен делать, и как я могу это сделать (было бы действительно полезно, если бы были примеры). Спасибо заранее!

4b9b3361

Ответ 1

Уведомление о запросе будет нажимать на службу Service Broker, а не непосредственно на ваше приложение. См. The Mysterious Notification, чтобы понять, как это работает. Ваше приложение ожидает уведомлений, отправив в базу данных WAITFOR(RECEIVE). Это означает, что каждый из 100 клиентов занимает один рабочий поток SQL Server (которые ограничены, см. max worker threads). Я видел, что это работает на производстве с +1000 клиентами (после того, как вы столкнулись с опцией максимального рабочего потока), но я бы посоветовал это сделать.

Моя рекомендация заключалась бы в том, чтобы отслеживать службы один для изменения, используя SqlDependency/QueryNotifications. Эта служба затем будет толкать уведомления, используя, например, WCF, всем вашим работающим приложениям. Вы должны подписаться на общие изменения (the table Foo was changed), а не на конкретные (the row x in table Foo was inserted).

Как правило, SqlDependency/Query Notifications могут только информировать вас о том, что данные изменились, но не будут вводить новые данные. Приложение должно обновить свои локальные наборы данных, выполнив запросы снова, после уведомления.

Ответ 2

Будьте осторожны, используя SqlDependency class - он имеет проблемы утечки памяти. Hovewer, вы можете использовать реализацию с открытым исходным кодом класса SqlDependency - SqlDependencyEx. Он использует триггер базы данных и собственное уведомление Service Broker для получения событий о изменениях таблицы. Это пример использования:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

С SqlDependecyEx вы можете контролировать только UPDATE, избегая DELETE и INSERT. Надеюсь, это поможет.