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

6tdlim6h  于 2023-10-17  发布在  Ruby
关注(0)|答案(3)|浏览(124)

我在一个独立于rails应用程序运行的守护进程中获取ActiveRecord::ConnectionTimeoutError。我使用Passenger与Apache和MySQL作为数据库。
Passenger的默认池大小是6(至少文档是这么告诉我的),所以它不应该使用超过6个连接。
我将ActiveRecord的池大小设置为10,尽管我认为我的守护进程只需要一个连接。我的守护进程是一个带有多个线程的进程,它不时地调用ActiveRecord来将内容保存到与rails应用共享的数据库中。
我需要弄清楚的是,这些线程是否只是不能共享一个连接,或者它们只是不断地请求新连接而不释放它们的旧连接。我知道我可以增加池的大小并推迟问题的解决,但是守护进程可能有数百个线程,池迟早会耗尽连接。
我想知道的第一件事是,乘客确实只是使用6个连接,问题在于守护进程。我该怎么测试呢?
其次,我想弄清楚是否每个线程都需要自己的连接,或者是否只需要告诉它们重用它们已经拥有的连接。如果他们确实需要自己的联系,也许他们只需要被告知不要在不使用它们的时候抓住它们?毕竟线程大部分时间都在睡眠。

busg9geu

busg9geu1#

您可以通过ActiveRecord::Base.connection_handler.connection_pools访问ActiveRecord正在使用的连接池,它应该是一个连接池数组。你可能只会有一个在那里,它有一个connections方法。以获取它所知道的一系列联系。
你也可以做一个ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!),它将签入任何 checkout 的连接,其中线程不再活动。
不知道这是帮了忙还是让人更困惑

qv7cva1a

qv7cva1a2#

截至2019年2月,clear_state_cached_connections已被弃用并迁移到reap
承诺
更新了先前接受的答案:
ActiveRecord::Base.connection_handler.connection_pools.each(&:reap)

vsikbqxv

vsikbqxv3#

ActiveRecord::Base.connection_pool.stat

它会回来的。

{:size=>10, :connections=>3, :busy=>1, :dead=>0, :idle=>2, :waiting=>0, :checkout_timeout=>5.0}

如果你对多线程数据库工作感兴趣,请查看我的答案here

相关问题