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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以列出池中当前的所有数据库连接?相关的知识,希望对你有一定的参考价值。

我在一个独立于rails应用程序运行的守护进程中获得ActiveRecord::ConnectionTimeoutError。我正在使用带有Apache和mysql的Passenger作为数据库。

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!),它会检查任何已检查出的线程不再存在的连接。

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

另一答案

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

Commit

以前接受的答案更新:

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

以上是关于是否可以列出池中当前的所有数据库连接?的主要内容,如果未能解决你的问题,请参考以下文章

数据库连接池问题 Max Pool Size

VBA 列出 MS Access 中所有打开的对象

Redis可以帮助规避数据库连接限制

更改 Tomcat 数据源池中的目录

超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。

使用 Spring 的 Tomcat 数据源池中的所有连接都处于活动状态