首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以列出池中当前的所有数据库连接?

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

Stack Overflow用户
提问于 2011-11-15 02:43:20
回答 2查看 3.8K关注 0票数 8

我将ActiveRecord::ConnectionTimeoutError放入一个独立于rails应用程序运行的守护进程中。我使用Passenger with Apache和MySQL作为数据库。

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

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2011-11-17 02:36:43

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

你也可以做一个ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!),它将检入任何已检出的连接,这些连接的线程不再是活动的。

不知道这是更有帮助还是更令人困惑

票数 6
EN

Stack Overflow用户

发布于 2019-02-04 17:44:55

自2019年2月起,clear_state_cached_connections已弃用并迁移至reap

Commit

已更新以前接受的答案:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8126474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档