Проблема с синхронизацией базы данных - PullRequest
0 голосов
/ 06 августа 2011

Программное обеспечение, которое моя компания ставит на каждый из мобильных компьютеров наших клиентов, имеет локальную базу данных MySQL.Эти мобильные компьютеры подключены к Интернету через мобильную широкополосную карту.Мы отправляем информацию, которая будет считана в строку и сохранена в локальной базе данных клиента через файлы XML размером от 1 до 600 КБ.(Примечание: мы делаем это, чтобы клиенты по-прежнему имели доступ к данным, когда подключение к Интернету недоступно.)

XML-файлы размером 1-600 КБ хранятся в папке для каждого пользователя на нашем сервере до тех пор, пока они не будут загружены.через веб-сервис .net / C #, который подает файл клиенту, который обращается к веб-сервису со своим токеном.Клиенты могут иметь до 20-40 МБ этих небольших XML-файлов при первом подключении.В обычный день они могут загрузить до нескольких мегабайт этих файлов.Программное обеспечение на мобильном компьютере клиента проверяет файлы в своей папке на сервере каждые 10 секунд с помощью веб-службы.

Новый файл XML создается каждые 15 минут с изменениями, которые необходимо внести в базу данных пользователя.и файл XML не создается, если не было внесено никаких изменений.Самый большой XML-файл (600 КБ) содержит 1000 записей для локальной базы данных пользователя.Каждая запись имеет более 10 столбцов, некоторые из которых содержат более 10 символов.

Проблемы с нашим методом:

  • Этот метод медленный.(Синхронизация пустой базы данных может занять 1,5 часа).

  • Сжатие файлов XML отсутствует, поэтому размеры загружаемых файлов больше, чем необходимо.

  • XML-файлы больше, чем они должны быть, потому что они содержат ненужную информацию.

  • Мы не отслеживаем, что находится у пользователябазы данных, поэтому пользователи могут потерять синхронизацию.

  • Он основан на файлах, и это вызывает много операций чтения / записи на жестком диске.

Кто-нибудь может предложить лучший способ сделать это?

1 Ответ

0 голосов
/ 06 августа 2011

Звучит как две проблемы для меня.

  1. Обновление пользовательских баз данных до последней основной базы данных может быть выполнено путем отслеживания версий.Пользователь отправляет свой номер версии при звонке, и вы возвращаете SQL, необходимый для обновления его версии до последней.Каждый раз, когда вы обновляете базу данных master, генерируйте SQL для обновления из каждой возможной предыдущей версии, а затем просто возвращайте соответствующий SQL.Я говорю SQL, потому что это кажется более эффективным, но вы можете использовать XML, JSON или что-то еще, и это все равно будет более эффективным с версиями.

  2. Учет локальных изменений пользователя - более сложная проблема.Вы можете сохранить пользовательские изменения в виде SQL или другого формата в стороне и повторно применить их после обновления.Но кто имеет последнюю / лучшую информацию, это сложный вопрос.Часто вам нужна большая детализация, чем просто записи пользователя.Одна система может обновить часть информации - скажем, номер телефона для контакта - в то время как другая система обновит другую часть, скажем, свою электронную почту.Если система должна выбрать одну контактную запись или другую, в любом случае вы потеряете.Чтобы сделать это правильно, вы должны пометить время изменения каждого поля.Если удаленные устройства всегда подключены к сети, возможно, вам удастся попытаться выполнить синхронизацию и попросить пользователя разрешать конфликты каждый раз, когда он хочет внести изменения.

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