我在一个独立于rails应用程序运行的守护进程中获得ActiveRecord::ConnectionTimeoutError
。我正在使用Passenger,Apache和MySQL作为数据库。
Passenger的默认池大小为6(至少是文档告诉我的),因此它不应该使用超过6个连接。
我已将ActiveRecord
的池大小设置为10,即使我认为我的守护程序应该只需要一个连接。我的守护进程是一个具有多个线程的进程,这些进程在此处调用ActiveRecord
以将内容保存到与rails app共享的数据库中。
我需要弄清楚的是线程是否根本无法共享一个连接,或者他们是否只是在不释放旧连接的情况下继续请求新连接。我知道我可以增加池大小并推迟问题,但守护进程可能有数百个线程,迟早池将用完连接。
我想知道的第一件事是Passenger确实只使用了6个连接,而问题在于守护进程。我该如何测试?
其次,我想弄清楚每个线程是否需要自己的连接,或者是否需要告诉他们重用已经拥有的连接。如果他们确实需要他们自己的联系,也许他们只需要被告知在他们不使用时不要抓住他们?毕竟大部分时间都在休息。
答案 0 :(得分:5)
您可以通过ActiveRecord::Base.connection_handler.connection_pools
访问ActiveRecord正在使用的连接池,它应该是一个连接池阵列。你可能只有一个,它有一个connections
方法。获得它知道的连接数组。
您还可以执行ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!)
,它会检查哪些线程不再存在的已检出连接。
不知道这是否有助于或混淆更多
答案 1 :(得分:0)
自2019年2月起,clear_state_cached_connections
已过时,并移至reap
先前接受的答案已更新:
ActiveRecord::Base.connection_handler.connection_pools.each(&:reap)