生产中的线程导致太多的数据库连接错误

时间:2013-02-11 01:27:50

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

我正在尝试做一个线程化的活动记录查询。它在开发时测试正确,但它在生产时出现PG::Error (FATAL: sorry, too many clients already)错误。我对开发和生产都有完全相同的池大小。以下是我尝试在线程中运行的代码片段:

threads = []
acs.each do |a|
  threads << Thread.new do
    activity = Hash.new
    ActiveRecord::Base.connection_pool.with_connection do
      whouser = User.find(a.whoid)
      target = User.find(a.targetid) if !(a.targetid.blank?)  
      activity["user_name"] = whouser.user_name
      activity["user_id"] = whouser.id
      activity["f_uid"] = whouser.f_uid
      ....
    end
  end
end
threads.each { |t| t.join }  

对此的任何见解都会令人惊叹!

P.S我正在测试我的开发计算机上的生产和开发,但是将其作为生产运行。它在我的实际生产服务器上也遇到了同样的问题。

1 个答案:

答案 0 :(得分:2)

在耗尽与服务器的连接数之前,您只能创建这么多线程。最好设置一个简单的工作队列,并让每个线程在此列表中弹出,直到完成。

示例:

tasks = acs
threads = [ ]

10.times do
  threads << Thread.new do
    while (task = tasks.pop)
      # ...
    end
  end
end

Thread.join组件将保持不变。