4

Я изучаю концепцию пула подключений базы данных rails. в приложении rails я определил размер пула 5.Как работает пул подключений базы данных рельсов

Мое понимание о размере пула подключений, как показано ниже.

1) когда серверные направляющие запуска автоматически создают n количество соединений, определенных в файле database.yml. в моем случае это создаст 5 соединений, так как размер пула равен 5.

2) на каждом HTTP-запросе, если есть необходимость доступа к базе данных, тогда рельсы будут использовать доступное соединение из пула соединений для обслуживания запроса.

Но мой вопрос, если я ударил 1000 запрос в то время, то большую часть запроса не будет получить доступ к соединению базы данных, потому что мой размер пула соединений только 5.

ли мое выше понимание о рельсах соединения бассейн правильно??

Спасибо,

ответ

7

Этот размер бассейна предназначен для одного процесса. Конечно, если ваше приложение работает на нескольких процессах, у вас будет 5 соединений с базой данных для каждого из них. Если на ваш сервер попадает 1000 запросов одновременно, он будет распространять запросы между этими соединениями, когда он будет заполнен, остальные запросы ждут своей очереди.

+0

, так что, если мой веб-сервер является одиночным процессом, тогда будет только один пул соединений, и если он является множественным процессом, общее количество пулов соединений будет равно числу процессов. правильно?? – user2274074

+0

есть, правый. Но обычно приложение должно основываться на нескольких процессах/потоках. – mudasir

+0

, если одновременно выполняются два процесса: «Процесс» и «Процесс» B, тогда будет два отдельных пула подключений. если предполагается, что процесс «A» создает два потока, и если эти потоки должны получить доступ к базе данных, то какой пул соединений будет использовать эти потоки. пул соединений, созданный Process 'A' или Process 'B'. – user2274074

7

Да, из документации:

соединение бассейн синхронизирует доступ к нити ограниченного числа соединений с базой данных. Основная идея заключается в том, что каждый поток проверяет соединение с базой данных из пула, использует это соединение и проверяет подключение . ConnectionPool полностью потокобезопасен, а гарантирует, что соединение не может использоваться двумя потоками в то же самое время, при условии, что контракт ConnectionPool правильно соблюден. Он также будет обрабатывать случаи, в которых больше потоков, чем соединений: если все соединения были извлечены, а нить пытается проверить соединение в любом случае, тогда ConnectionPool будет ждать , пока какой-либо другой поток не проверит соединение.

Источник: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html

Если вы используете что-то вроде единорога, как HTTP сервер:

В Unicorn каждый процесс устанавливает свой собственный пул соединений, так что вы, если ваши настройки пула дб 5 и вы есть 5 рабочих Unicorn, тогда у вас может быть до 25 подключений. Однако, поскольку каждый рабочий-единорог может обрабатывать только одно соединение за раз, то, если ваше приложение не использует потоки внутри, каждый рабочий фактически использует только одно соединение db.

+0

http://stackoverflow.com/questions/34251081/rails-does-every-http-request-creates-a-new-connection-pool см. Эту ссылку, в котором говорится, что каждый рабочий процесс создает новый пул соединений. – user2274074

+1

Ну, если вы используете что-то вроде единорога: В Unicorn каждый процесс устанавливает свой собственный пул подключений, поэтому вы, если ваш балл db-пула равен 5, и у вас есть 5 сотрудников Unicorn, вы можете иметь до 25 подключений.Однако, поскольку каждый рабочий-единорог может обрабатывать только одно соединение за раз, то, если ваше приложение не использует потоки внутри, каждый рабочий фактически использует только одно соединение db. – Laurens

+0

что касается пассажира. Я использую пассажира с ngnix. – user2274074

Смежные вопросы