Мы разрабатываем приложение WPF с использованием SqlDependencies для обновления приложения в соответствии с базой данных. Мы узнали несколько раз, что уведомления о запросах выглядят нерегулярными - приложение не показывает последнее состояние базы данных. Как только кто-то что-то изменит на столе, приложение быстро обновляется и отображает последнее состояние.SqlDependency - предотвратить dataloss между событием и повторной регистрацией запроса снова?
Теперь я написал инструмент, который как можно быстрее изменяет базу данных на определенное количество раз и другой инструмент, который регистрирует SqlDependencies и просто подсчитывает, сколько SqlDependencies было вызвано.
private void AddNewQuery(string query)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
var command = new SqlCommand(query, connection);
var dependency = new SqlDependency(command);
dependency.OnChange += OnQueryChanged;
}
}
private void OnQueryChanged(object sender, SqlNotificationEventArgs e)
{
AddNewQuery('SELECT Foo,Bar FROM dbo.Foobar');
OnDatabaseChanged();
var dependency = sender as SqlDependency;
dependency.OnChange -= OnQueryChanged;
}
private void OnDatabaseChanged()
{
lock(_databaseChangedLocker)
_counter++;
}
По-видимому, тем быстрее выполняется основное приложение, тем меньше уведомлений распознаются SqlDependency-Reader. Например: Я запускать 1000 запросов в несколько раз:
9,2 секунды Итоговые результаты времени выполнения в 520 уведомлений, полученных (52%) 14 секунд Итоговые результаты времени выполнения в 822 уведомлений (82,2%) 19,3 секунды Общий пробег дает 957 уведомлений (95,7%).
Есть ли способ предотвратить этот тип dataloss и гарантировать, что каждое изменение приводит к QueryNotification? Мы запускаем SQL Server 2008 R2.