ActiveRecord::ConnectionTimeoutError

后端 未结 4 1765
轮回少年
轮回少年 2020-12-09 21:20

I am getting this error:

\'could not obtain a database connection within 5 seconds (waited 5.001017 seconds). The max pool size is currently 16; consider inc         


        
相关标签:
4条回答
  • 2020-12-09 22:01

    As Frederick pointed out you need to return opened ActiveRecord connections to the connection pool.

    If you're using the Thin server, in threaded mode, then you need to add this to your Sinatra app:

    after do
      ActiveRecord::Base.connection.close
    end
    

    ...instead of using the ConnectionManagement suggestion. The reason is that Thin splits the request processing over 2 threads and the thread that is closing the ActiveRecord connection is not the same as the thread that opened it. As ActiveRecord tracks connections by thread ID it gets confused and won't return connections correctly.

    0 讨论(0)
  • 2020-12-09 22:02

    As Frederick pointed out you need to return opened ActiveRecord connections to the connection pool.

    As kuwerty suggests, when you are using Thin, ConnectionManagement will not return connections to the pool. I suggest that instead of closing the current connection like kuwerty says, you return the connection to the pool like so.

    after do
      ActiveRecord::Base.clear_active_connections!
    end
    

    For those who want to reproduce the problem, try this example.

    EDIT:

    I made an explanation of why using middleware ActiveRecord::Connectionadapters::ConnectionManagement won't work with Thin in threaded mode, which you can find here.

    0 讨论(0)
  • 2020-12-09 22:07

    It sounds like you are not returning connections to the pool at the end of the request. If not then each request that uses the db will consume 1 connection and eventually you'll exhaust the pool and start getting the error messages you describe

    Active Record provides a rack middleware to handle this ActiveRecord::ConnectionAdapters::ConnectionManagement, which should take care of things as long as its earlier in the middleware chain than anything that will access active record.

    You can also take care of the connection management yourself. The docs have more details but one way of doing it is sticking all of your db accesses in a block like this

    ActiveRecord::Base.connection_pool.with_connection do
      ...
    end
    

    Which checks out a connection at the start of the block and checks it back in afterwards.

    0 讨论(0)
  • 2020-12-09 22:21

    It's better to use the middleware provided with ActiveRecord:

    use ActiveRecord::ConnectionAdapters::ConnectionManagement
    
    0 讨论(0)
提交回复
热议问题