在我的案例中并行运行数据导入

时间:2011-11-24 16:34:49

标签: mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我正在开发 Rails v2.3 应用。并使用 MySQL v5.1 作为我的数据库。

目前,在我的Rails应用程序中,我有一个 rake任务(从Helper调用一个方法),用于执行多个 .sql 转储文件以从中导入数据我的development database模板数据库。例如execute_dump("fill_all_tables.sql")

.sql 文件如下所示:

TRUNCTE TABLE cars;
ALTER TABLE DISABLE KEYS
INSERT INTO cars (col1,col2,col3,...) VALUES SELECT (...) FROM template_db.cars WHERE...
ALTER TABLE ENABLE KEYS
OPTIMIZE TABLE

然后,我有一个第二次 rake任务,它将运行一个脚本来创建一个新的(第三个)数据库,同时从同一个模板数据库导入数据但放入数据到新创建的3rd database

因此,两个rake任务(或方法)都从相同的模板数据库导入数据,但是将分隔到不同的数据库。 (一个用于开发数据库,​​另一个用于第三个数据库)。

我想让上述数据导入并行发生的事情。如何在Rails中实现?

P.S。

我的development database3rd database都在数据导入开始之前创建了相同的表。我的第一个rake任务将在数据导入后执行更多操作。

1 个答案:

答案 0 :(得分:0)

如果您希望这样做,请尝试使用UNIX shell而不是Ruby。这样,你就不会乱搞纤维,叉子和线。创建两个填充目标数据库的rake任务,并将以下代码放在名为db_load.sh的文件中:

     #!/bin/sh
     echo "preparing db"
     rake my_project:prepare_database

     echo "starting: copy of template to database 2"
     rake my_project:copy_from_template_database_to_database_2 &

     echo "starting: copy of template to database 3"
     rake my_project:copy_from_template_database_to_database_3 &

最后两行末尾的&符号告诉shell以非阻塞方式运行这些任务。它们将并行运行。 (当然,更改rake任务的名称以适合您的项目。)

要运行此脚本,请键入chmod +x db_load.sh以使其可执行,然后键入:

     ./db_load.sh

或者,您可以在rake任务中使用反引号表示法来完成同样的事情:

    puts "starting: copy of template to database 2"
    `rake my_project:copy_from_template_database_to_database_2 &`

    puts "starting: copy of template to database 3"
    `rake my_project:copy_from_template_database_to_database_3 &`