Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Вт Авг 24 2004 12:39 Заголовок сообщения: Обновление набора записей |
|
|
Как обновить только изменившиеся записи на клиенте ? Записей в талице несколько тысяч, если каждый раз грузить их все, то как-то медленновато получается. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Чт Авг 26 2004 10:07 Заголовок сообщения: Re: Обновление набора записей |
|
|
Лобовое решение.
Хорошо бы знать на чём всё закручивается, но общее решение...
Завести поле номер версии записи.
Прога берёт из генератора ( зависит от реализации), проставляет этот номер у записей которые меняет.
Уведомляет всех (зависит от реализации) об изменениях.
Все остальные смотрят max код весрии своих данных, если в БД есть код больше, значит данные устарели. Выкачиваются данные с кодом версии больше текущей.
Или я не правильно понял задачу
А вообще, зачем на клиента тащить столько записей?
Вероятно, весьма не кашерно. _________________ До onlina Andrew C. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Чт Авг 26 2004 14:02 Заголовок сообщения: |
|
|
Interbase 7.1
C++Builder 5.0
На клиента бывает необходимо тащить такую кучу записей, потому что например, им надо выбирать заказчика из списка ... или что-нибудь еще подобное. Понятно, что загрузив однажды этот список я могу уже на клиенте выбирать из него. Но если хотя бы одна запись в базе поменялась, то приходится обновлять весь список. Идея с номером версии записи мне понравилась, попробую, хотя мне кажется в таком случае будут тормоза с обновлением индекса по этому номеру версии. А без индекса тормоза будут при выборке обновленных записей.... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Чт Авг 26 2004 14:28 Заголовок сообщения: |
|
|
Тормоза будут всяко.
Ежели брать время с сервака (ну синхронизировать клиентов) можно вместь номера хранить датувремя. Это должно улучшить селективность индекса.
Надо поэкспериментировать, т.к. (допустим) список товаров меняется редко, список клиентов чаще и т.п.
У такого метода есть одни огромнейшие грабли: удаление записей.
Обойти только таблицей # удалённых записей, но кто её будет поддерживать????
С учётом клиентов оффлайн
Если удаление происходит редко и в одном месте (админ).
Завести event на удалёние и считать, что вся таблица у клиента устарела.
Пусть тянет всю.
Точно так же и с офф клиентами, при запуске считать таблицу невалидной.
Вот и тормоза.
ЗЫ на ibase.ru была статья одного буржуя. У него сумашедший дом, биллинговая система с кучей серваков, клиентов и ботов (IBots;)
Он всё это умудряется синхронизировать.
Но всё довольно наворочено
Может поправит... _________________ До onlina Andrew C. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Чт Авг 26 2004 14:45 Заголовок сообщения: |
|
|
Удалений не планируется, по крайней мере в режиме реального времени их отслеживать не надо. При очередном запуске клиентской программы она все равно затянет актуальную информацию. Отслеживать в основном надо только добавление записей. Насколько я понимаю, с использованием поля для хранения времени изменения (или добавления) записи такая проблема снимается. Т.е. клиент должен загружать только записи со значением этого поля больше определенного. Только вот как уведомить клиента, что надо обновить набор записей ? Использовать эвэнты не получилось по непонятной причине - они срабатывают всегда, с периодичностью порядка полсекунды. Что тут за грабли - пока не понял. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Чт Авг 26 2004 15:05 Заголовок сообщения: |
|
|
На евенты все плюются
По идее, они должны срабатывать во время комита транзакции.
Клиент получает евент и цифирьку, сколько раз тот сработал.
Лобовое решиение: переодически тянуть max(дата) , когда это актуально.
Вопрос периодичности.
Если есть индекс вниз это не дорого.
Вдруг сервак будет тупить: select first 1 дата from table order by дата desc
Можно пытаться городить "в рукопашную", допустим, через UDF .....
А там сдерживает только фантазия
Главный критерий: А ОНО ТОГО СТОИТ? _________________ До onlina Andrew C. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
cerber
Зарегистрирован: 19.12.2003 Сообщения: 296 Откуда: Казахстан, Актюбинск
|
Добавлено: Чт Авг 26 2004 15:20 Заголовок сообщения: |
|
|
а нельзя сделать такую штуку:
создаётся таблица и все добавления и удаления заносятся в неё, клиент проверяет её постоянно, с интервалом к примеру 2 минуты, и проверяет что изменилось, и изменения закачивает или удаляет из своего набора. Раз в час к примеру таблица на сервере очищается, и набор из этой базы на клиенте тоже очищается.
Вариант конечно по принципу зачем делать просто когда легче усложнить, но всё таки. ![Rolling Eyes](images/smiles/icon_rolleyes.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Andy-C
Зарегистрирован: 09.12.2003 Сообщения: 73 Откуда: Нальчик
|
Добавлено: Чт Авг 26 2004 15:35 Заголовок сообщения: |
|
|
Клиентов всё равно придётся синхронизировать
Кто когда что и откуда подчитывает
Проще читать max(дата) и сравнивать со своей.
Надо экспериментировать.... _________________ До onlina Andrew C. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Чт Авг 26 2004 17:22 Заголовок сообщения: |
|
|
К тому же эта таблица синхронизации вырастет, недолго этого ждать. Такой вариант я отбросил уже давно |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mike
Зарегистрирован: 17.11.2001 Сообщения: 339 Откуда: ekb
|
Добавлено: Пт Окт 15 2004 11:58 Заголовок сообщения: |
|
|
Если кому-то интересно ...
Вобщем, добавил в таблицы по 2 поля:
FDEL - признак, что удалена запись,
FCHANGECNT - счетчик изменений, каждый раз берется из генератора.
качаю с сервера только те записи, у которых FCHANGECNT>LastChangeCnt, если надо удалить запись - ставлю FDEL=1 и опять же обновляю FCHANGECNT
естественно, в таблицах пришлось создать индексы по этим полям
все работает быстро и красиво |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|