понимание уведомлений в Windows Desktop c # application [duplicate]

17
задан Noctis 15 May 2014 в 06:27
поделиться

3 ответа

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

3
ответ дан Community 18 August 2018 в 06:28
поделиться

Уведомление о запросе будет нажимать на службу 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 Notifications может только сообщать вам, что данные изменились, t нажмите новые данные . Приложение должно обновить свои локальные наборы данных, выполнив запросы снова, после уведомления.

16
ответ дан Remus Rusanu 18 August 2018 в 06:28
поделиться

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

0
ответ дан reza taroosheh 18 August 2018 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: