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

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


person mike.dev    schedule 14.02.2013    source источник


Ответы (3)


Уведомление о запросе будет отправлено в службу Service Broker, а не непосредственно в ваше приложение. См. Таинственное уведомление, чтобы понять, как оно работает. Ваше приложение ожидает уведомлений, опубликовав оператор 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 могут только информировать вас об изменении данных, но не передают новые данные. Приложение должно обновить свои локальные наборы данных, повторно выполнив запросы после получения уведомления.

person Remus Rusanu    schedule 14.02.2013

Будьте осторожны при использовании класса SqlDependency — он имеет проблемы с утечками памяти. Однако вы можете использовать реализацию класса 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. Надеюсь это поможет.

person dyatchenko    schedule 23.02.2015

Если вы не обновляете базу данных вручную и все манипуляции с данными происходят в вашем приложении, вам следует обнаруживать изменения на уровне службы приложений или бизнес-уровне вместо базы данных, если вы зависите от технологии базы данных и переход к другим базам данных будет затруднен. С другой стороны, если у вас есть ручное обновление базы данных или зависимость от базы данных не важна, вы можете использовать CDC (сбор данных chane) и вносить изменения в сервис-брокер, а ваше приложение извлекает изменения из сервис-брокера, а затем отправляет их клиенту с помощью технологии двунаправленной связи http. то же, что SignalR.

person reza taroosheh    schedule 28.06.2018