#java #xml #database #serialization #synchronize
#java #xml #База данных #сериализация #синхронизировать
Вопрос:
У меня есть распределенное Java-приложение, и я хочу отправлять данные базы данных между двумя базами данных, которые находятся в отдельных компьютерных системах или устройствах Android. Какой наилучший способ передачи данных таблицы через сокет-соединение?Я думаю о том, чтобы отправлять строки таблицы в виде текстовых строк или xml-элементов или создать класс (реализует Serializable inteface) для каждой таблицы и передавать arraylist этих объектов для каждой таблицы. Какое, по вашему мнению, более эффективное решение? Есть какой-либо другой способ сделать это? базы данных могут отличаться, например mysql, sqlite, h2database, поэтому я не могу использовать какую-либо встроенную функцию базы данных для синхронизации (здесь, пока я ищу что-то подобное, я прочитал кое-что о базе данных orable, у которой есть функция, подобная этой).
Большое вам спасибо!!
Комментарии:
1. можете ли вы положиться на сервер для выполнения синхронизации?
2. Когда вы говорите «синхронизировать», вы имеете в виду, что две базы данных должны выглядеть одинаково впоследствии или что вам нужно перенести данные из одной базы данных в другую?
3. @Bozho Да, например, то, что я хочу сделать, это как иметь приложение Java на ПК и приложение Android после синхронизации. Я хочу, чтобы приложение на ПК имело копию данных базы данных с устройства Android и наоборот.
4. @alpian Вы правы, я просто редактирую свой вопрос. Я просто хочу отправить данные базы данных, и поскольку я впервые делаю что-то подобное, я спросил, какое решение является более эффективным.
5. @javment: Хорошо, я ответил, предполагая перекрестную синхронизацию. Я бы использовал тот же механизм и для одностороннего использования — просто пусть принимающий компьютер является единственным подписчиком по этой теме.
Ответ №1:
Лично я считаю XML слишком подробным для передачи данных, в итоге у вас может получиться половина объема данных для содержимого и половина для структуры.
<record>
<name>John</name>
<age>30</age>
</record>
Большая часть пространства теряется при определении структуры, мало что остается для данных, которые вы хотите (Джон, 30).
Количество строк обычного текста слишком ограничено, по крайней мере, учитывайте значения, разделенные запятыми, если необходимо.
Name;Age
John;30
Первая строка предназначена только для меток, если вы уверены, что это никогда не изменится, вы можете удалить ее.
Сериализация объектов может быть слишком опасной для передачи данных, поскольку со временем вы можете создать несовместимости, которые приведут к сбою десериализации. Например, достаточно ввести или удалить поле.
Взгляните на JSON, он не такой подробный, как XML, и более структурированный, чем просто строки. Важной частью, конечно, является то, что вы правильно обрабатываете свои данные на обоих концах, но, учитывая, что вы знаете отправленную структуру, вы можете преобразовать ее должным образом.
Пример:
{name: John, age: 30 }
Ответ №2:
Просто несколько идей о шагах, которые я бы предпринял, если бы делал это.
Сначала прочитайте данные из баз данных в некоторый общий формат на каждой машине или устройстве. Использовать JPA для этого было бы проще всего.
Поскольку два устройства должны быть синхронизированы, вам нужна общая точка для сравнения. Затем, если в данных есть расхождения, вам нужно решить, какая копия правильная. Или, если это одна таблица, просто объедините обе копии и затем отправьте их обратно на каждую машину.
Итак, я бы использовал сервер очередей для этого. На каждой машине считайте данные с помощью JPA и отправляйте их с помощью Gson на сервер очередей (для которого я бы использовал HornetQ). Данные с обеих машин поступают в очередь ввода.
Затем у вас есть один считыватель для этой входной очереди, который объединяет данные, отбрасывая дубликаты и создавая канонический вид данных. Наконец, эти данные затем передаются (снова с помощью Gson) в раздел JMS, на который подписаны оба (или все) устройства.
Затем каждое устройство получает каждую строку базы данных и может добавлять или обновлять соответственно. Вам понадобится специальный журнал на каждом устройстве для записи удалений, если вы когда-либо захотите удалить данные везде.
Это только начало …! 🙂
Комментарии:
1. Это кажется более полным ответом, хотя я бы не согласился с программным обеспечением, решающим, какое слияние является подходящим в случае конфликта. Возможно, было бы разумно добавить столбец version и отклонять обновления на основе того, было ли внесено изменение в отношении последней версии или более старой. Возможно, просто рассмотрите возможность отправки diff на сервер. Изменены пары идентификатор строки ключ / значение