2011-03-29 20 views
5

这里是一个开放式问题的位,所以我会先概述问题。我们有一个Resque工人谁应该弹出的数据同步作业关闭队列,原因有两方面,使用cron(和支付Rails环境开机时间超过岁及以上)很烂,和备选队列,以及Github上发一个相当不错的案件,当他们announced Resque。此外,Redis的时间序列的功能已经发挥我们的基础设施,在这里我们也洗牌TS数据到的RRDTool &等的重要组成部分......ActiveRecord在分叉/线程应用程序中运行时无法重新连接?

这里的问题,与工作之间典型的三小时(但工作人员可以随时安排工作......因此排队),PostgreSQL服务器就会消失。足够容易治愈,我预计,相应的环境下设置reconnect: true将确保这一预期一样。我在fewplaces读取reconnect: true不会为使用fork()应用程序。其中,自然Resque确实,启动它的工作人员......我不明白的部分是为什么ActiveRecord的重新连接无法在这些情况下工作?

我注意到的reconnect!MySQL Adapter和ActiveRecord的的PostgreSQL Adapter不同的实现......但无论哪种方式我期望的ActiveRecord reconnect: true配置工作。

的问题似乎是不够的,当孩子过程中存在,它会关闭处理由父创建的文件明确(因此挂到数据库的连接) - 这可能在这样一个关闭一个文件句柄ActiveRecord无法识别连接已终止的方式?

还有,对于它的价值,一个ActiveRecord aware fork()这是我能找到在Github上,作为pastie - 这是未经测试,但我认为它的工作原理(未与当前的Rails试过..)

我的问题比较多,为什么不能在AR工作的自动重新连接,如果你fork()(后来,我不能成为唯一一个遇到这个问题的人;我正在使用Resql来使用PGSQL!)

回答

6

尽管不完全是“为什么不能重新连接”但我认为,有什么可以帮你的是下面的代码在初始化阶段放的地方:


Resque.after_fork do |job| 
    ActiveRecord::Base.connection.reconnect! 
end 

更新: 关于重新连接 - 看来,这是MySQL只功能。 这是它是如何在MySQL适配器一起使用: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L848 正如你所看到的,它使用了底层驱动程序的重新连接功能。 https://github.com/kwatch/mysql-ruby/blob/master/ext/mysql.c#L923

在另一方面,PostgreSQL的适配器没有做就什么reconnect选项,就可以看到https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb

此外,PostgreSQL的网站明确表示,“分叉开放的libpq连接的过程可能会导致不可预测的结果” - http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html 而且,这也是显而易见的是,C驱动不提供任何重新连接功能。

+0

罗马,肯定 - 我有解决办法,但我专门找了,为什么重新连接的原因:真不工作。我想知道是否它是关于并发性(activerecord的'allowconcurrency'标志) - 并认识到第一个连接仍然连接...但我真的很茫然。 – 2011-04-18 06:56:54

+0

好吧,通过查看activerecord代码,我可以告诉的是,'reconnect'选项不支持PostgreSQL适配器。 – Roman 2011-04-18 07:02:27

+0

罗马人,你可以更具体,也许是一个链接 - 有一个实现的地方,我发现...(我敢肯定) – 2011-04-18 19:02:33

相关问题