我有一个简单的rails应用程序,它从模型的每个实例的远程URL中抓取JSON(让我们称之为A)。然后,应用程序在第一个关联模型下创建一个新数据点。让我们称之为中间模型B和数据点模型C.还有一个前端,让用户以图形/视觉方式浏览这些数据。
因此,层次结构是A有很多 - > B有很多 - > C.我为每个A刮取一个URL,该URL返回一些B的实例,其中包含具有相应B的数据的新C。
在尝试测试/扩展这个应用程序时,我遇到了一个问题,rails会停止处理,挂起一段时间,最后抛出一个“ActiveRecord :: ConnectionTimeoutError无法在5.000秒内获得数据库连接”显然5是只是默认值。
我无法理解为什么会发生这种情况1)没有显式的DB调用,2)日志没有显示任何内幕DB调用发生时它工作3)它有时工作而不是其他。
rails 4 AR和连接池有什么问题?!
几点说明:
任何建议或想法都非常感谢!
答案 0 :(得分:1)
我相信我找到了这个问题的原因。当您通过
循环关联时model.association.each do |a|
#work here
end
Rails做了一些“使用”数据库连接的幕后工作。我把引号用在引号中,因为在我的情况下,我认为结果实际上是从内存中返回的。我渴望加载关联,因此DB实际上从未被命中。
在
中包裹我的块的初步测试ActiveRecord::Base.connection_pool.with_connection do
#something me doing?
end
似乎已经解决了这个问题。
我通过在我正在打印的线程错误消息中添加一个回溯来发现这一点。
-----对于使用resque的人----
我还必须在我的resque.rake文件中添加一点,以使其完全按预期工作。
task 'resque:setup' => :environment do
Resque.after_fork do |job|
ActiveRecord::Base.establish_connection
end
end
答案 1 :(得分:0)
如果您正在使用
ActiveRecord::Base.transaction do
... code
end
在线程中完成更快的事务,请注意这会锁定数据库。我有一个应用程序在一个线程中为一个非常昂贵的进程执行此操作,它将锁定数据库超过5秒。它更快,但会锁定您的数据库