ActiveRecord模型“丢失”了他们的find_by_ *方法

时间:2014-10-31 17:02:00

标签: ruby-on-rails ruby activerecord resque

我们有一个相对标准的Ruby on Rails项目,它有很多在Resque下运行的后台作业(Redis作为后端。)

问题很少 - 也许每月一次,也许少一点 - 我们会突然看到来自Resque的大量异常。例外情况都是如下:

undefined method `find_by_id` for User():Class
undefined method `find_by_name` for CustomerAccount():Class
undefined method `find_by_id` for Job():Class

出现突然间,所有ActiveRecord :: Base模型都丢失了整个线程的find_by_*方法。重新启动工作人员可以解决问题。

我知道,一般来说,答案必须是“有人,某个地方 - 可能是宝石 - 正在以某种方式打破方法。”或许,不知何故,常量被重新分配给不同的类。但在我开始进行彻底的调查之前,我想检查是否有人遇到过这个问题并且已经解决了。

这个项目运行Ruby 2.1.1p76,Rails 3.2.17,Resque 1.25.1。

1 个答案:

答案 0 :(得分:1)

结束这个古老的问题的循环:事实证明,moonfly的评论确实是问题所在,并且在长期运行的工作人员中,数据库连接断开将导致此(有些奇怪)错误消息。

知道了根本原因后,我们能够添加定期的conn刷新(以在工作者空闲时间过长时尝试使连接保持活动状态),并且还可以为db conn 被删除,然后重新连接。因此,非常感谢@moonfly,如果您想将评论转化为答案,我们很乐意为您提供延迟很多的答案。