我正在遇到Sidekiq工作者方面的问题。
ActiveRecord::ConnectionTimeoutError: could not obtain a database connection within 5.000 seconds (waited 5.000 seconds)
我遵循有关使用ActiveRecord :: ConnectionTimeoutError
和适当大的连接池的建议。
我想找出是否用尽了连接池。我记录了ActiveRecord :: Base.connection_pool
中的size
和connections.length
,但它们保持不变,大小为100,连接数为5,这表明这不是资源泄漏问题。
我的MySQL服务器配置允许最多400个并发连接。
我的作业最终看起来像这样:
class MyJob < ActiveJob::Base
queue_as :default
rescue_from StandardError do |exception|
# clear connections on exception. Not sure if this is a good idea or not.
ActiveRecord::Base.clear_active_connections!
end
def perform()
logger.info "size"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @size }
logger.info "connections"
logger.info ActiveRecord::Base.connection_pool.instance_eval { @connections }.length
# Ensure connections come from connection pool.
ActiveRecord::Base.connection_pool.with_connection do |conn|
# do stuff
end
end
end
这是诊断导致资源匮乏或泄漏的正确方法吗?还有其他技术可以用来找出为什么会发生这种情况吗?
database.yml
中定义的连接池大小是多少?你使用了多少个 Sidekiq 工作线程? - Matouš Borák