ruby - 是否可以列出当前池中的所有数据库连接?

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

我在一个独立于 Rails 应用程序运行的守护进程中得到 ActiveRecord::ConnectionTimeoutError。我将 Passenger 与 Apache 和 MySQL 一起用作数据库。

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

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

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

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

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

最佳答案

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

您还可以执行 ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!) 它将 checkin 任何已 checkout 的线程不再存在的连接。

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

关于ruby - 是否可以列出当前池中的所有数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126474/

相关文章:

ruby-on-rails - 在 Rails form_for 辅助字段中使用 ParsleyJS

ruby-on-rails-3 - cucumber 特征输出中的蓝色破折号是否总是意味着跳过?

php - CodeIgniter/PHP Active Record 不会递增整数

ruby-on-rails-3 - Rails 3 : datetime_select with am/pm options

ruby-on-rails - 销毁空白嵌套属性

sql - 创建ActiveRecord中是否不存在功能?

ruby - 如何在Ruby中编码 “Happy Birthday Josh”

ruby - 更新faSTLane失败: signet requires Ruby version >= 2. 4.0

mysql - rake 数据库 :create giving error

arrays - "merge"两个数组并在Rails中迭代新数组