![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Репликация по email или на дискетах
atruhin © (2005-07-10 20:32:00)Есть филиалы, где происходит сбор данных, есть управление куда данные должны поступать. Т.к. в некоторых филиалах нет постоянного доступа к интернету, необходима возможность проведения репликации с помощью сменных носителей.
Вырисовывается примерно такой алгоритм:
1. Данные вносятся в БД, и одновременно в ЛОГ (Может быть как отдельная таблица, так и внешний файл).
2. Данные переносятся на сервер, где производится репликация, после чего сервер записывает на носитель, код подтверждения репликации записей с номерами от ... до ...
3. Данный код загружается в клиентскую часть после чего данные удаляются данные о реплицированных записях.
Тут и возникают вопросы:
1. Нормальный это способ, или есть что то более изящное.
2. Очень вероятна ситуация что данные на сервер реплицировали, а ответ сервера не донесли, тогда при следующей порции данных нужно отсеивать отработанные данные.
Проект новый на стадии обдумывания, поэтому можно учесть любые советы.
Slym (2005-07-11 06:29:00) [1]Подтверждение об обновлении можно сделать так:
После вормирования посылки в спец таблицу пишеш дату репликации и контрольную сумму посылки.
В ответ на посылку сервер отправляет дату репликации и контрольную сумму полученной посылки клиент находит эту запись у себя и отмечает как "Репликация ОК".
Псевдокод:
Client:
File:=CreateRepl(Date);
ReplTable.AppendRecord(Date,Hash(File));
Send(File);
Server
File=GetFile;
AnswerFile=Date(File)+Delimeter+Hash(File);
Send(AnswerFile);
Client
AnswerFile=GetFile;
Find=ReplTable.Locate('Date;Hash',[AnswerFile.Date,AnswerFile.Hash]);
if Find then
ReplTable['Finished']:=true;
Deniz (2005-07-11 06:17:00) [2]>в некоторых филиалах нет постоянного доступа к интернету
Нет вообще или все таки иногда есть?
Если иногда бывает, то можно посмотреть в сторону кешированных изменений.
Slym (2005-07-11 05:34:00) [3]Обычно хватает Добавить ModifyDate в "главную" таблицу, а с записями из главной таблицы попавшей под репликацию реплицирвать все подчиненные, а на месте уже разбираться надо оно или не надо
Slym (2005-07-11 05:17:00) [4]Поле ModifyDate - при операции изменении записи выставляешь
DataSet['ModifyDate']:=Now;
При обмене делай
SELECT * FROM TABLE WHERE ModifyDate> :ReplDate;
Т.е. выдать все данные младше опред даты. (даты репликации)