【发布时间】:2011-11-14 18:43:19
【问题描述】:
我在一个独立于 rails 应用程序运行的守护进程中获得了ActiveRecord::ConnectionTimeoutError。我使用 Apache 和 MySQL 作为数据库的乘客。
Passenger 的默认池大小为 6(至少文档是这样告诉我的),因此它不应使用超过 6 个连接。
我已将ActiveRecord 的池大小设置为 10,尽管我认为我的守护程序应该只需要一个连接。我的守护进程是一个具有多个线程的进程,它在这里和那里调用ActiveRecord 以将内容保存到它与rails 应用程序共享的数据库中。
我需要弄清楚线程是否根本无法共享一个连接,或者它们是否只是不断请求新连接而不释放旧连接。我知道我可以只增加池大小并推迟问题,但是守护程序可能有数百个线程,并且池迟早会耗尽连接。
我想知道的第一件事是,Passenger 确实只使用了 6 个连接,问题出在守护进程上。我该如何测试?
其次,我想弄清楚是否每个线程都需要自己的连接,或者是否只需要告诉他们重用他们已经拥有的连接。如果他们确实需要自己的连接,也许只需要告诉他们在不使用它们时不要保留它们?毕竟线程大部分时间都在休眠。
【问题讨论】:
标签: ruby ruby-on-rails-3 activerecord database-connection pool