RoR / MySQL: сколько экземпляров Ruby может работать на 1 базе данных MySQL (параллельно)? - PullRequest
2 голосов
/ 31 января 2012

У меня есть скрипт в контроллере, который я запускаю из консоли Ruby on Rails (IRB).

Этот сценарий постоянно создает-считывает-обновляет (не удаляет) базу данных MySQL, получая данные из Интернета.

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

-> Несколько экземпляров Ruby будут работать с 1 базой данных.

Это проблема? Может ли это создать какие-либо конфликты записи (Создать / Обновить) в базе данных? Если да, могу ли я что-нибудь сделать, чтобы избежать таких конфликтов?

Если это не проблема: сколько экземпляров Ruby я могу "выложить" в базу данных параллельно?

1 Ответ

0 голосов
/ 31 января 2012

Вы можете определенно запустить несколько консолей одновременно для одной базы данных.Ограничение - количество открытых соединений, которые допускает база данных.В Mysql 5.1 значением по умолчанию было 100, а в 5.5 - 151. Маловероятно, что узкие места закончатся, пока что-то еще не станет узким местом.

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

transaction do
    # all your code to create / modify a single item goes here
end

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

Кроме того, из-за слишком коротких указаний, поместите все ограничения проверки, которые вы можете непосредственно в базу данных.Поэтому, если у вас есть ограничения уникальности или отношения внешнего ключа, добавьте их в свою схему вручную, поскольку rails не делает этого по умолчанию.Сложные проверки, которые сравнивают различные объекты модели (кроме отношений FK, как в belongs_to), могут потребовать проверки триггера базы данных - надеюсь, вам это не нужно.Но если вы получите все свои проверки в базе данных изначально, и тогда все должно работать.

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