Можно ли перечислить все соединения с базой данных, которые в данный момент находятся в пуле? - PullRequest
7 голосов
/ 14 ноября 2011

Я получаю ActiveRecord::ConnectionTimeoutError в демоне, который работает независимо от приложения rails. Я использую Passenger с Apache и MySQL в качестве базы данных.

Размер пула пассажиров по умолчанию равен 6 (по крайней мере, так говорит документация), поэтому он не должен использовать более 6 соединений.

Я установил размер пула ActiveRecord равным 10, хотя я думал, что моему демону нужно только одно соединение. Мой демон - это один процесс с несколькими потоками, который тут и там вызывает ActiveRecord, чтобы сохранить материал в базе данных, которую он разделяет с приложением rails.

Что мне нужно выяснить, так это то, что потоки просто не могут совместно использовать одно соединение или они просто продолжают запрашивать новые соединения, не освобождая свои старые соединения. Я знаю, что мог бы просто увеличить размер пула и отложить проблему, но у демона могут быть сотни потоков, и рано или поздно в пуле закончатся соединения.

Первое, что я хотел бы знать, это то, что Passenger действительно использует только 6 соединений, и что проблема заключается в демоне. Как мне это проверить?

Во-вторых, я хотел бы выяснить, нужно ли каждому потоку свое собственное соединение или ему просто нужно сказать, чтобы повторно использовать соединение, которое у них уже есть. Если им действительно нужны свои собственные связи, может, им просто нужно сказать, чтобы они не держались за них, когда они их не используют? Нити все-таки спят большую часть времени.

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Вы можете получить доступ к пулам соединений, которые ActiveRecord использует через ActiveRecord::Base.connection_handler.connection_pools, это должен быть массив пулов соединений. Вероятно, у вас там будет только один, и у него есть метод connections. Чтобы получить массив соединений, о которых он знает.

Вы также можете сделать ActiveRecord::Base.connection_handler.connection_pools.each(&:clear_stale_cached_connections!), и он проверит все проверенные соединения, поток которых больше не существует.

Не знаю, помогает ли это или смущает больше

0 голосов
/ 04 февраля 2019

По состоянию на февраль 2019 года clear_state_cached_connections устарел и перемещен в reap

Подтвердить

Предыдущий принятый ответ обновлен:

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

...