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