Форум сайта python.su
Доброго дня.
Хочу сделать синхронизацию (частичное обновление данных) для, например, двух копий программы, работающих с одной базой данных. То есть, при внесении изменений в базу с одной машины, должно происходить это же изменение на другой.
Как этого достичь? Программа должна быть особым образом построена или достаточно отслеживать изменения в базе данных? (Используется MySQL)
Офлайн
AsheduА архитектура у вас какая? Если поднят сервер MYSQL , то все данные и будут общие. Т.е вроде как автоматом будет как вы хотите. Или вы автономно будете программы использовать, а потом сливать базы?
при внесении изменений в базу с одной машины, должно происходить это же изменение на другой
Отредактировано doza_and (Май 18, 2013 19:14:41)
Офлайн
doza_andПри загрузке программы берется информация из базы, отображается, хранится в памяти. Некоторая информация обновляется при открытии доп. диалогов, но в основном окне наполнение не имеет синхронизации.
А архитектура у вас какая? Если поднят сервер MYSQL , то все данные и будут общие. Т.е вроде как автоматом будет как вы хотите. Или вы автономно будете программы использовать, а потом сливать базы?
Офлайн
Если система слабо нагружена более естественно просто обновлять данные по таймеру.
Не являюсь специалистом по MYSQL в Firebird использовал реализованные в ней события http://www.janus-software.com/fbmanual/manual.php?book=php&topic=49
Первое впечатление что в MySQL это странно сделано http://stackoverflow.com/questions/5771925/python-how-to-get-notifications-for-mysql-database-changes
Кроме того, если вы будете опираться на механизм передачи сообщений базы данных то вы сильно будете привязаны к именно к этой базе.
Тут уже начинается область священных войн. Где обеспечивать целостность данных, на уровне приложений или на уровне движка СУБД. (MySQL наше все а программки к ней можно писать на разных языках или, сравните, моя программа это все, доступ к данным только через мои процедуры - а движки баз можно к ней разные цеплять.)
Я как программист предпочитаю подход 2. В этом случае механизм уведомлений нужен независимый от базы. Мне например нравится https://pypi.python.org/pypi/Pyro4
Для простых проектов можно воспользоваться http://docs.python.org/2/library/asyncore.html
http://docs.python.org/2/library/asynchat.html
Можно смотреть в сторону RabbitMQ.
Офлайн
doza_andИсходя из описания, выбора особого нет и этот вариант хоть и простой, зато самый эффективный.
Если система слабо нагружена более естественно просто обновлять данные по таймеру.
Офлайн
doza_and
Если система слабо нагружена более естественно просто обновлять данные по таймеру.
LexanderПо таймеру я делать принципиально не хочу. Данных много, дергать огромные таблицы, затем отрисовывать - медленный процесс. Именно из-за этого захотелось более осмысленного обновления.
Так что +1.
LexanderСпасибо. А вам случйно не встречались примеры реализации?
К MySQL сделать запрос, который будет проверять и по запросу от клиента возвращать статус: есть изменения / нет изменений (чуть сложнее - где они произошли: какие именно наборы данных обновить).
Офлайн
AsheduПонятно и логично.
По таймеру я делать принципиально не хочу. Данных много, дергать огромные таблицы, затем отрисовывать - медленный процесс. Именно из-за этого захотелось более осмысленного обновления.
AsheduИменно под MySQL не видел, но не факт что их нет, просто не было надобности.
А вам случйно не встречались примеры реализации?
Офлайн
Lexander
Какая у вас хоть клиентская платформа?
Под осмысленным обновлением вы понимаете инкрементальное обновление данных или все же допустима полная перезагрузка данных при изменении (когда уже точно известно, что изменения были)?
Допустимо ли изменение структуры таблиц? Можно просто добавить автобновляемое поле поле timestamp и простым запросом COUNT по этому полю узнать о факте изменений в таблице.
А два таких поля позволят даже вычислить строки, которые обновлялись.
Офлайн
:( https://github.com/mcarter/orbite
d2 не откликается
Ashedu
что позволяет работать ей автономно
Ashedu
а так же каждый компьютер может выступать в роли БД
Ashedu
Да, изменение таблиц допустимо…
Офлайн
https://pypi.python.org/pypi/orbited
https://bitbucket.org/desmaj/orbited
https://github.com/gameclosure/orbited2
http://labs.gameclosure.com/orbited2/
AsheduВ MySQL нет реализации механизма Notifications, как в Postgres, MS SQL Server или Oracle.
Но даже если в каждой строке будет запись о времени изменения, по которой мы дернем нужные данные для обновления, всё равно придется использовать таймер, что в данном случае, возможно, допустимо, но всё равно коробит.
AsheduТак не используйте треды.
Коробит потому что в моем опыте постоянно возникали проблемы наподобие “MySQL server has gone away” при осуществлении запросов через треды.
Отредактировано Lexander (Май 19, 2013 19:52:21)
Офлайн