【问题标题】:Is it possible to list all database connections currently in the pool?是否可以列出当前在池中的所有数据库连接?
【发布时间】:2011-11-14 18:43:19
【问题描述】:

我在一个独立于 rails 应用程序运行的守护进程中获得了ActiveRecord::ConnectionTimeoutError。我使用 Apache 和 MySQL 作为数据库的乘客。

Passenger 的默认池大小为 6(至少文档是这样告诉我的),因此它不应使用超过 6 个连接。

我已将ActiveRecord 的池大小设置为 10,尽管我认为我的守护程序应该只需要一个连接。我的守护进程是一个具有多个线程的进程,它在这里和那里调用ActiveRecord 以将内容保存到它与rails 应用程序共享的数据库中。

我需要弄清楚线程是否根本无法共享一个连接,或者它们是否只是不断请求新连接而不释放旧连接。我知道我可以只增加池大小并推迟问题,但是守护程序可能有数百个线程,并且池迟早会耗尽连接。

我想知道的第一件事是,Passenger 确实只使用了 6 个连接,问题出在守护进程上。我该如何测试?

其次,我想弄清楚是否每个线程都需要自己的连接,或者是否只需要告诉他们重用他们已经拥有的连接。如果他们确实需要自己的连接,也许只需要告诉他们在不使用它们时不要保留它们?毕竟线程大部分时间都在休眠。

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord database-connection pool


    【解决方案1】:

    您可以通过ActiveRecord::Base.connection_handler.connection_pools 访问 ActiveRecord 正在使用的连接池,它应该是一个连接池数组。你可能只有一个,它上面有一个connections 方法。获取它知道的连接数组。

    您也可以执行ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!),它将签入任何已签出的线程不再活动的连接。

    不知道这是否有助于或混淆更多

    【讨论】:

    • 我相信它有自己的,因为它在一个单独的进程中运行,但是我不知道你是如何运行你的守护进程的,你的数据库可能会限制连接,从而拒绝你的守护进程连接
    【解决方案2】:

    截至 2019 年 2 月,clear_state_cached_connections 已被弃用并移至 reap

    Commit

    先前接受的答案已更新:

    ActiveRecord::Base.connection_handler.connection_pools.each(&:reap)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-08
      • 2019-11-15
      • 1970-01-01
      • 2012-06-16
      • 2014-08-13
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多