2008-11-07 5 views
36

Мое требование: у меня есть веб-приложение J2EE для сервера и клиентское J2EE-приложение. Иногда клиент может отключиться. Когда клиент приходит в сеть, он должен иметь возможность синхронизировать изменения туда и обратно. Также я должен иметь возможность контролировать, какие строки/таблицы нужно синхронизировать на основе некоторых фильтров/правил. Есть ли какие-либо существующие рамки Java для этого? Если мне нужно реализовать самостоятельно, каковы различные стратегии, которые вы можете предложить?Стратегия для автономной/онлайн-синхронизации данных

Одним из моих решений является поддержка SQL-журналов и выполнение тех же операторов с другой стороны во время синхронизации. Вы видите какие-либо проблемы с этой стратегией?

ответ

26

Существует ряд библиотек Java для синхронизации данных/репликации. Два, о которых я знаю, это daffodil и SymmetricDS. В предыдущей жизни я глупо реализовал (на Java) свой собственный процесс репликации данных. Это похоже на то, что должно быть довольно простым, но если данные могут обновляться в нескольких местах одновременно, это адски сложно. Я настоятельно рекомендую вам использовать один из вышеупомянутых проектов, чтобы попытаться обходить эту сложность самостоятельно.

15

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

Метод обычно заключается в том, чтобы добавить поле «изменено» ко всем таблицам и сравнить измененное поле клиента для данной записи в заданной строке по отношению к модифицированной дате сервера. Если они не совпадают, вы заменяете данные сервера.

Будьте осторожны с автогенерируемыми ключами - вам необходимо убедиться, что ваша целостность данных сохраняется при копировании с клиента на сервер. Строго запуская SQL-запросы снова на сервере, вы можете столкнуться с ситуацией, когда ключ с автогенерированием изменился, и внезапно ваши внешние ключи указывают на разные записи, чем вы планировали.

Часто при импорте данных из другого источника вы отслеживаете первичный ключ от внешнего источника, а также свой собственный первичный ключ. Это упрощает определение изменений и различий между наборами данных для сложных ситуаций синхронизации.

+3

Я проголосовал за это (извините), потому что я думаю, что это значительно упрощает связанные с этим проблемы. Он не касается безопасности вообще или выборочной синхронизации. Тезис из Stettler - хорошее введение в проблемы (http://www.ifi.uzh.ch/archive/mastertheses/DA_Arbeiten_2003/Stettler_Christian.pdf) – 2010-07-15 06:08:07

+0

Спасибо за информацию. Я думаю, что ссылка Гамлета - отличная рекомендация. Ключевые моменты, на которые ответил Кивели, достаточно хороши для праймера, который занимает 30 секунд для чтения. – 2011-03-21 07:31:37

0

Что лучше всего подходит для хранения данных на стороне клиента в приложении? Вы можете выбрать встроенную базу данных, такую ​​как SQLite или очередь сообщений, или некоторое хранилище объектов или (если ни одно из них не может быть использовано, поскольку это веб-приложение) файлы/документы, сохраненные на клиенте, с использованием веб-базы данных или IndexedDB через API HTML,

Проверьте бумагу Gold Rush: Mobile Transaction Middleware with Java-Object Replication. Документация Microsoft о периодически подключаемых системах описывает два подхода: ориентированные на обслуживание или ориентированные на сообщения и ориентированные на данные. «Золотая лихорадка» использует более ранний подход. В более позднем подходе используется слияние репликации данных.