Запрещение нескольким пользователям выполнять одно и то же действие - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть приложение Swing Desktop, которое установлено на многих компьютерах в локальной сети.У меня есть база данных mysql, с которой все они общаются.Ровно в 5 часов вечера в каждом из этих приложений возникает поток, который пытается выполнить резервное копирование файлов на удаленный сервер.Я бы хотел, чтобы все настольные приложения не делали одно и то же.

Я думал об этом так:

После пробуждения в 17:00 все приложения попытаются записать строку в таблицу MYSQL.Они напишут ту же информацию.Только 1 будет успешным, а остальные получат исключение дублирующейся строки.Кто бы ни преуспел, затем продолжает запускать программу резервного копирования.

Мои вопросы:

  1. Это правильный способ действий?Есть ли лучший (более простой) способ? Я знаю, что мы можем сделать это и с помощью сокетов.Но я не хочу идти по этому пути ... слишком много кодирования, и мне нужно было бы обеспечить, чтобы все системы могли сначала общаться друг с другом (ping)

  2. Будет ли MySQL поддерживать такие функции, как функция.Моя БД ИННО БД.Так что я думаю, что это так.Обычно у меня будет около 20-30 пользователей в локальной сети.Это приведет к огромным накладным расходам на обработку БД.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

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

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

У меня много вопросов по поводу дизайна:

  1. Почему все они пишут "один и тот же ряд"? Разве они не пишут информацию для своего отдельного экземпляра?
  2. Почему у каждого из них был бы одинаковый первичный ключ? Если бы было автоматическое увеличение или отметка времени, у вас не было бы этой проблемы.
  3. Какая изоляция установлена ​​для соединения с базой данных? Если для него установлено значение SERIALIZABLE, вы заставите каждого ждать завершения предыдущего, за счет производительности.
  4. Могли бы вы сделать так, чтобы все они записывали файлы в общий каталог и собирали их позже упорядоченным образом?

Сейчас я просто мозговой штурм.

0 голосов
/ 25 ноября 2011

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

Итак, когда клиент просыпается - Он проверит некоторую таблицу в вашей БД (MYSQL), чтобы увидеть, завершено ли задание резервного копирования или выполняется в настоящее время. Если работа завершена, клиент продолжит выполнять свои обычные обязанности. Вы можете решить, как обрабатывать случай, когда задание выполняется. - Если клиент обнаружит, что задание резервного копирования не было выполнено в течение дня, он запустит задание резервного копирования. В то же время изменит строку, чтобы указать, что задание резервного копирования запущено. После завершения резервного копирования клиент изменит таблицу, чтобы указать, что резервное копирование завершено.

Этот подход предотвратит скачок в сетевой активности, а также может обеспечить элементарную форму аварийного переключения. Таким образом, если один клиент выходит из строя, другой клиент позднее может попытаться выполнить резервное копирование. (хотя это немного сложнее. В основном все сводится к тому, что клиент должен делать, когда видит, что выполняется резервное копирование).

0 голосов
/ 24 ноября 2011

Кажется, вы хотите сделать резервную копию данных сервера, а не данных клиента.

Я рекомендую использовать 3-уровневую архитектуру с использованием Java EE.Затем вы можете использовать службу таймера для запуска резервного копирования.

Хотя обычно программа резервного копирования является независимой программой, например, запускаемой заданием cron на сервере.Но опять же: вам нужен сервер для правильной работы, а не просто общая папка.

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