Отправить данные базы данных через сокет - PullRequest
2 голосов
/ 27 апреля 2011

У меня есть распределенное Java-приложение, и я хочу отправить данные базы данных между двумя базами данных, которые находятся в отдельных компьютерных системах или устройствах Android. Каков наилучший способ передачи данных таблицы через соединение через сокет? Я думаю о том, чтобы отправить строки таблицы в виде текстовых строк, или элементов XML, или создать класс (реализующий интерфейс Serializable) для каждой таблицы и передать массив этих объектов для каждый стол. Что, по вашему мнению, является наиболее эффективным решением? Есть ли другой способ сделать это? базы данных могут отличаться, например, mysql, sqlite, h2database, поэтому я не могу использовать любую встроенную функцию базы данных для синхронизации (здесь, пока я ищу что-то похожее, я читал что-то о orable базе данных, у меня есть такая функция).

Большое спасибо !!

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Лично я считаю, что XML слишком многословен для передачи данных, вы можете получить половину объема данных для контента и половину для структуры.

<record>
   <name>John</name>
   <age>30</age>
</record>

Большая часть пространства теряется при определении структуры,немного осталось для данных, которые вы хотите (Джон, 30).

Обычные текстовые строки слишком ограничены, по крайней мере рассмотрите значения, разделенные запятыми, если необходимо.

Name;Age
John;30

Первая строкапросто для меток, если вы уверены, что они никогда не изменятся, вы можете удалить их.

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

Взгляните на JSON , оно не такое многословное, как XML, и более структурированное, чем просто строки.Важной частью, конечно, является то, что вы правильно обрабатываете свои данные на обоих концах, но, зная, что структура отправлена, вы можете правильно ее преобразовать.

Пример:

{name: John, age: 30 }
1 голос
/ 27 апреля 2011

Просто несколько идей о шагах, которые я бы предпринял, если бы делал это.

Сначала прочитайте данные из баз данных в некотором общем формате на каждом компьютере или устройстве.Использовать JPA было бы проще всего.

Поскольку оба устройства должны быть синхронизированы, вам нужно общее место для сравнения.Затем, если есть расхождения в данных, вам нужно решить, какая копия является правильной.Или, если это одна таблица, просто возьмите объединение обеих копий, а затем отправьте их обратно на каждую машину.

Итак, я бы использовал сервер очередей, чтобы сделать это.На каждой машине прочитайте данные, используя JPA, и отправьте их, используя Gson , на сервер очередей (для которого я бы использовал HornetQ ).Данные с обеих машин поступают во входную очередь.

Затем имеется один считыватель для этой входной очереди, который объединяет данные, отбрасывая дубликаты и создавая каноническое представление данных.Наконец, эти данные затем отправляются (опять же с Gson) в тему JMS, на которую подписаны оба (или все) устройства.

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

Это только начало ...!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...