SQLDependency + Service Broker

Я использую SqlDependency для получения уведомления об изменении данных в какой-либо таблице.

    private void subscribeBroker()
    {
        using (var conn = new SqlConnection(connString))
        {
            conn.Open();

            var cmd = new SqlCommand("SELECT text FROM dbo.Test");
            cmd.Connection = conn;

            var dependency = new SqlDependency(cmd);
            dependency.OnChange += dependency_OnChange;
            SqlDependency.Start(connString);

            cmd.ExecuteNonQuery();
        }
    }

    void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        //Do something...
        subscribeBroker();
    }

Работает, но есть вопросы.

1) Я не нашел способа, как получить информацию о том, какая строка была изменена. Мне нужно прочитать все данные из всей таблицы, чтобы увидеть, что отличается. Есть ли способ получить эту информацию? (первичный идентификатор или что-то еще) Может быть, использовать другой подход, чем SqlDependency?

2) Что делать, если «кто-то» меняет данные очень быстро. Возможно ли, что некоторые изменения не будут уведомлены? (Меня беспокоит время между уведомлением и временем, когда я снова подпишусь на него.

Спасибо.


person Chatumbabub    schedule 23.10.2012    source источник
comment
Что касается 1, что-то мешает вам просто запросить идентификатор в дополнение к тексту, если вам нужна информация о строке?   -  person tmesser    schedule 23.10.2012
comment
Не уверен, как это должно помочь. Допустим, эта тестовая таблица имеет древовидные строки. При изменении второй строки вызывается dependency_OnChange, и SqlCommand возвращает строки дерева без информации об изменениях.   -  person Chatumbabub    schedule 24.10.2012


Ответы (1)


Оповещение о 1-м запросе информирует вас о том, что что-то изменилось. Если вы хотите получить то, что было изменено с прошлого раза, вы, вероятно, могли бы использовать столбец меток времени.

Уведомление о 2-запросе информирует вас об изменениях, а затем удаляется. то вы снова подписываетесь на уведомление снова. тем временем между сбрасыванием и созданием уведомлений является то время, в течение которого уведомление об изменениях не отправляется.

Уведомления о запросах больше подходят для ситуаций, когда ваши данные не меняются часто. Например, некоторые кэшированные значения классификации. Итак, вы подписываетесь на изменения в какой-либо таблице, ждете изменений, и в момент их возникновения вы получаете последнюю версию данных. Следует учитывать, что уведомление о запросе также использует ресурсы сервера, поэтому, если у вас есть огромная таблица и вы хотите получить изменения в небольшом подмножестве данных, многие запросы могут быть затронуты с точки зрения производительности (что-то вроде индексированного представления).

Если вам нужно предпринять какие-то действия на основе измененных данных, и каждое изменение важно, то я предполагаю, что триггер + сервисный брокер может быть более эффективным. Или, в зависимости от ваших потребностей, изменить сбор данных.

person Jānis    schedule 25.10.2012