2015-05-07 10 views
4

У меня есть таблица mssql, которая содержит информацию о чатах. Он вычисляет столбцы, имеет миллионы строк и используется/заполняется сторонним приложением. Теперь я хочу использовать эту таблицу для отображения истории чата на моем веб-сайте и возможного в будущем иметь возможность отправлять сообщения с помощью signalr. Я провел пару тестов, используя sqldependency, и это работает, но только для конкретных запросов, которые не помогут в моем случае (я должен исключить вычисленные столбцы, не могу заказать по последнему сообщению, не может установить 100 сообщений и т. Д.)Альтернатива для sqldependency

So мои вопросы - вот что было бы альтернативой? используя веб-сервис, который обследует базу данных каждые x секунд?

Боковое примечание, я вообще не влияю на стол.

+0

«* Что было бы альтернативой? Использование веб-службы, которая опроса базы данных каждые х секунд? *" - Да, в значительной степени. – James

+0

Кроме того, что вы имеете в виду, не влияя на стол? Означает ли это, что вы не контролируете, как данные вставляются? Чудеса могут быть сделаны с помощью специальных вспомогательных столбцов и триггеров, если единственное, что вам нужно, это то, что сторонники '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Если они не используют 'select *', конечно: D – Luaan

ответ

6

Я думаю, вы все еще можете использовать SqlDependency, если вы думаете немного больше о своих действительных требованиях.

Запрос, который вы используете для обнаружения изменений, не обязательно должен быть одним и тем же, который вы используете для fetch изменений. Таким образом, у вас может быть

select id from chat where chatRoomId = 123 

как «обнаружение изменений запроса». Это просто скажет вам: «Появилось новое сообщение. Или еще», ничего больше. Затем, чтобы получить фактические новые строки, вы можете использовать сложный запрос:

select 
top 100 someComplexColumn, everythingElse 
from chat 
where chatRoomId = 123 
order by messageTime desc 

Пока «запрос обнаружения изменений» достаточно хорошо отделяющий большую часть изменений вы не заботитесь о с изменениями вы делаем заботимся, вы в порядке. Помните, SqlDependency на самом деле не говорит вам , что изменилось, или что-нибудь еще о данных. Он не заботится о том, сколько данных соответствует запросу сейчас - он отслеживает изменения, которые соответствуют указанному фильтру. И поскольку сообщения чата обычно неизменяемы, вы можете уйти с проверки только столбца id (например, «новый элемент»). Если ваши сообщения в чате доступны для редактирования, вам также нужно добавить столбец changedOn в свой «запрос на обнаружение изменений».

+0

Ничего себе, так просто, но почему-то я никогда не думал об этом. Я просто обновляю свой код с помощью запроса simpel, и даже с большим количеством записей каждый раз запускается событие OnChange. Сообщения чата arent editable, так что это должно быть хорошо. Единственное, что я забыл и потратил некоторое время на то, чтобы понять, что я не запускал ExecuteReader() для моего «обнаружения изменений». Удивительно, спасибо! – blaataap

0

Хорошей альтернативой для SqlDependency является SqlDependencyEx. Он не имеет утечки памяти problems и использует триггер базы данных, а также собственное уведомление 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 вы в состоянии контролировать INSERT, DELETE, UPDATE отдельно и получать фактические измененные данные (xml) в случае объектно арг. Фильтрация входящих сообщений помогает реализовать желаемое поведение. Надеюсь, эта помощь.

Смежные вопросы