2

私は私の開発環境のconfig/database.ymlで、以下の設定で、「レールコンソール」を通じて、シングルスレッドのRails 5.0アプリケーションを実行している:Railsで一度に開いているデータベース接続を調べるにはどうすればよいですか?

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/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:202:in `block in wait_poll' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `loop' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `wait_poll' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:154:in `internal_poll' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:278:in `internal_poll' 
/Users/nataliab/.rvm/gems/[email protected]/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/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:158:in `synchronize' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `poll' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:717:in `acquire_connection' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:490:in `checkout' 
/Users/nataliab/.rvm/gems/[email protected]/gems/activerecord-5.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `connection' 

答えて

0

あなたはでのPostgreSQLからこの情報を取得することができますとすぐにアプリケーションコードは(それがConcurrent::FixedThreadPool.new(1)経由でやっている)別のスレッドが作成されますよう

SELECT * from pg_stat_activity; 
0

I'm running a single-threaded Rails 5.0 application

、それはもはやありませんシングルスレッドアプリケーション 'です。

How can I figure out what connections are not being closed or what queries are still running that would cause this to occur.

は、閉鎖されていない接続を検査するには、あなたが調べることができ ActiveRecord::ConnectionAdapters::AbstractAdapterオブジェクトの配列を返します ActiveRecord::Base.connection_pool.connections、経由での接続の現在の接続プールのリストにアクセスすることができます。例えば、現在、接続プール内の各接続のスレッド ownerinspectし、実行することができます:

ActiveRecord::Base.connection_pool.connections.map(&:owner).map(&:inspect) 

I am baffled because nowhere should concurrent queries be running at once.

あなたの仮定を接続プールが枯渇しているので、同時クエリが実行されていることが正しくありません。この問題を解決する方法については、他の(非常によく似た)質問に対する私の回答を参照してください。Does concurrency happen even when only one thread is in a thread pool?

関連する問題