8

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 increasing it.'

First I got this error, I bumped up the count from 5 to 16. But it's still happening and i am the only one test out the database. Why is this happening when I am the only user?

I am not on rails btw. I am using:

ActiveRecord::Base.establish_connection ({
    :adapter => 'mysql2',
    :database => 'ck',
    :host => 'localhost',
    :username => 'root',
    :password => '',
    :pool => 16,
    })

and using Sinatra.

Thanks

4

4 回答 4

12

正如 Frederick 指出的那样,您需要将打开的 ActiveRecord 连接返回到连接池。

如果您在线程模式下使用瘦服务器,那么您需要将其添加到您的 Sinatra 应用程序中:

after do
  ActiveRecord::Base.connection.close
end

...而不是使用 ConnectionManagement 建议。原因是 Thin 将请求处理拆分为 2 个线程,并且关闭 ActiveRecord 连接的线程与打开它的线程不同。由于 ActiveRecord 通过线程 ID 跟踪连接,它会感到困惑并且不会正确返回连接。

于 2013-02-16T10:02:42.123 回答
5

听起来您没有在请求结束时将连接返回到池。如果不是,那么使用 db 的每个请求都将消耗 1 个连接,最终您将耗尽池并开始收到您描述的错误消息

Active Record 提供了一个机架中间件来处理这个ActiveRecord::ConnectionAdapters::ConnectionManagement问题,只要它在中间件链中比访问活动记录的任何东西更早,它就应该处理这些事情。

您也可以自己处理连接管理。文档有更多详细信息,但一种方法是将所有数据库访问粘贴在这样的块中

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

它会在块的开头检查一个连接,然后再将其签入。

于 2012-12-03T02:06:51.167 回答
1

最好使用ActiveRecord 提供的中间件:

use ActiveRecord::ConnectionAdapters::ConnectionManagement
于 2014-05-21T07:11:34.600 回答
0

正如 Frederick 指出的那样,您需要将打开的 ActiveRecord 连接返回到连接池。

正如 kuwerty 建议的那样,当您使用 Thin 时,ConnectionManagement不会将连接返回到池中。我建议不要像 kuwerty 所说的那样关闭当前连接,而是像这样将连接返回到池中。

after do
  ActiveRecord::Base.clear_active_connections!
end

对于那些想要重现问题的人,试试这个例子

编辑:

我解释了为什么ActiveRecord::Connectionadapters::ConnectionManagement在线程模式下使用中间件无法与 Thin 一起使用,您可以在此处找到。

于 2016-04-20T22:27:55.230 回答