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

Eri*_*k B 7 ruby activerecord database-connection pool ruby-on-rails-3

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

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

我将ActiveRecord池大小设置为10,即使我认为我的守护进程只需要一个连接.我的守护进程是一个具有多个线程的进程,这些进程ActiveRecord在此处调用以将内容保存到与rails app共享的数据库中.

我需要弄清楚的是线程是否根本不能共享一个连接,或者他们是否只是在不释放旧连接的情况下继续请求新连接.我知道我可以增加池大小并推迟问题,但守护进程可能有数百个线程,迟早池将耗尽连接.

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

其次,我想弄清楚每个线程是否需要自己的连接,或者是否需要告诉他们重用已经拥有的连接.如果他们确实需要他们自己的联系,也许他们只需要被告知在他们不使用时不要抓住他们?线程毕竟是大部分时间都在睡觉.

Ers*_*yan 6

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

你也可以做一个ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!),它会检查任何已检出的连接哪个线程不再存在.

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