ruby on rails-生产中的线程导致数据库连接过多错误



我正在尝试执行线程化活动记录查询。它在开发过程中进行了适当的测试,但在生产过程中给了我一个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我在我的开发计算机上测试生产和开发,但将其作为生产运行。它在我的实际生产服务器上也出现了同样的问题。

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

示例:

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

Thread.join组件将保持不变。

相关内容

  • 没有找到相关文章

最新更新