bounty将在4天后过期。回答此问题可获得+100的声誉奖励。simo正在寻找来自声誉良好的来源的答案。
我们有一个rails 4应用程序,它有一个预定的rake任务,这将产生sidekiq工作器,我们开始看到错误:
An ActiveRecord::ConnectionNotEstablished occured in background
Exception
No connection pool for User
config/initializers/leaked_connections.rb:44:in `connection_with_forbid_implicit'
lib/ads_apis/ads_geo_targeter_base.rb:75:in `seeder_sync_targeting'
简单来说就是:
user = User.find(user_id)
我们尝试在sidekiq设置中降低并发性,并在数据库设置中增加池大小,但没有解决这个问题,我们在应用程序中不断得到模型的No connection pool for
。
对此有何调查暗示?
1条答案
按热度按时间oknrviil1#
看起来这个补丁很旧了,我们可以在这篇文章中看到它:https://medium.com/points-san-francisco/threading-with-rails-eeb843bfa20
文章提到这个补丁不适用于Rails5以上的版本,所以如果你的Rails应用程序仍然卡在Rails4上,这可能就是原因。
这个补丁也是为了减轻数据库的负载。但是基本上如果你的数据库池等于
Rails_max_thread
(考虑到你的网络服务器是Puma),那么它可能会在某个时候达到可用数据库连接的最大数量,然后需要匹配的资源(RAM,计算等)。那么我不太确定这个补丁在哪个方面会那么有用。默认的Rails最大线程数是5,这经常在https://twitter.com/nateberkopec/status/1564689914830229504?s=20&t=2uzgF8xYNRzgWtjEJuvfEQ中讨论,但是您可以通过将线程数减少到3并增加Puma并发(Puma工作线程)来减轻数据库负载