[英]How do I figure out what database connections are open at any one time in Rails?
我正在通过“ rails控制台”运行单线程Rails 5.0应用程序,并在我的开发环境中使用config/database.yml
的以下配置:
development:
adapter: postgresql
encoding: utf8
database: sims
username: postgres
password: password
pool: 5
timeout: 15000
host: 127.0.0.1
始终,在下面运行我的代码最终将因“无法获取连接”错误而死亡:
pool = Concurrent::FixedThreadPool.new(1)
promises = links.map do |link|
Concurrent::Promise.execute(executor: pool) do
result = process_link(link)
if result
if result.kind_of?(Array)
result.each do |my_obj|
my_obj.update_attributes({ :a => a })
records_processed = records_processed + my_obj.matches.count
end
else
records_processed = records_processed + result.matches.count
result.update_attributes({ :a => a })
end
end
end
end
promises.map(&:wait).map(&:value!)
如何确定未关闭哪些连接,或者哪些查询仍在运行,这会导致这种情况发生? 我感到困惑,因为并发查询不应在任何地方一次运行。
Error during processing: (ActiveRecord::ConnectionTimeoutError) could not obtain a connection from the pool within 5.000 seconds (waited 5.003 seconds); all pooled connections were in use
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:202:in `block in wait_poll'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `loop'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `wait_poll'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:154:in `internal_poll'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:278:in `internal_poll'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `block in poll'
/Users/nataliab/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/monitor.rb:214:in `mon_synchronize'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:158:in `synchronize'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `poll'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:717:in `acquire_connection'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:490:in `checkout'
/Users/nataliab/.rvm/gems/ruby-2.4.0@global/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `connection'
您可以使用以下方法从PostgreSQL获取此信息:
SELECT * from pg_stat_activity;
我正在运行一个单线程的Rails 5.0应用程序
一旦您的应用程序代码创建了另一个线程(通过Concurrent::FixedThreadPool.new(1)
),它就不再是“单线程应用程序”。
我如何确定哪些连接没有关闭或哪些查询仍在运行,这会导致这种情况发生。
要检查未关闭的连接,可以通过ActiveRecord::Base.connection_pool.connections
访问当前连接池的连接列表,该列表将返回一个ActiveRecord::ConnectionAdapters::AbstractAdapter
对象数组。 例如,要inspect
连接池中当前每个连接的线程owner
,可以运行:
ActiveRecord::Base.connection_pool.connections.map(&:owner).map(&:inspect)
我感到困惑,因为并发查询不应在任何地方一次运行。
您认为由于连接池已耗尽而正在运行并发查询的假设是不正确的。 关于如何解决此问题,请参考我对另一个(非常相似)问题的回答: 即使线程池中只有一个线程 , 并发也会发生吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.