Правильная настройка пула подключений базы данных database.yml для однопоточных приложений Rails
Мне было интересно узнать о следующей настройке в Rails database.yml:
По умолчанию количество подключений к базе данных для пула соединений ActiveRecord равно 5:
development:
...
pool: 5
Но по умолчанию Rails 3 является однопоточным.
Зачем вам нужно 5 подключений по умолчанию?
Насколько я понимаю, однопоточное приложение Rails не может запускать сразу несколько операций с базой данных, зачем вам нужно больше открывать соединение?
Я бы предположил, что 2 соединения имеют смысл, поэтому у вас всегда есть одно активное соединение, даже если другое время истекает, но наличие пяти соединений кажется мне немного странным.
Я что-то пропустил?
UPDATE
Если кому-то еще интересно, я просто нашел коммит, который объясняет это:
https://github.com/rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051
Фактически эти настройки по умолчанию не имеют никакого смысла, они были исправлены, но затем временно возвращены (год назад) из-за набора тестов.
Ответы
Ответ 1
Довольно поздняя вечеринка здесь, но сегодня у меня закончились соединения с базой данных.
Как и многие люди, я использую Sidekiq для выполнения асинхронных заданий, например, для отправки электронных писем. Важно отметить, что Sidekiq работает как многопоточный процесс.
Итак, у меня нет только однопоточного приложения Rails, поэтому этот ответ напрямую не применяется к заданному вопросу, но я подумал, что стоит что-то сказать здесь, поскольку я думаю, что многопоточные Rails приложения в настоящее время относительно нормальные.
Это означает, что вам нужно настроить размер пула таким образом, чтобы создавать достаточное количество подключений для обработки всех заданий, которые могут быть установлены в очередь и занимать больше 5 секунд (период ожидания по умолчанию для ожидания подключения к базе данных перед тем, ошибка).
Ответ 2
Управление соединениями
Основное преимущество пула соединений для сервера с одним потоком, такого как Mongrel/Passenger/etc, заключается в том, что соединение установлено/поддерживается в обработчике Rack вне основной обработки запросов Rails. Это позволяет установить соединение один раз и много раз, поскольку оно используется по-разному. Целью является повторное использование установленного соединения и минимизация количества подключений. Это должно препятствовать повторному подключению в течение заданного цикла обработки запроса и, возможно, даже между запросами (если я правильно помню).
Несколько параллельных соединений
Хотя большинство случаев использования (Mongrel/Passenger) однопоточные и могут использовать только одно соединение за раз - есть JRuby и серверы сред/приложений, которые имеют полную многопоточную поддержку. Rails был потокобезопасным, поскольку 2.2
-
Пул соединений обрабатывается внутри ActiveRecord, поэтому все серверы приложений должны вести себя в основном одинаково.
-
Пул соединений с базой данных запускается пустым и создает соединения со временем в соответствии с запросом. Максимальный размер этого пула по умолчанию равен 5 и настроен в файле database.yml.
-
Запросы и пользователи совместно используют подключения из этого пула. Запрос проверяет соединение при первом обращении к базе данных и затем проверяет соединение в конце запроса.
-
Если вы используете Rails.threadsafe! режиме, тогда может быть несколько потоков
одновременного доступа к нескольким соединениям, поэтому в зависимости от
нагрузка запроса может иметь несколько потоков, претендующих на несколько
соединения.
Вы можете соответствующим образом изменить, если вы используете однопоточное приложение. По умолчанию используется 5 в соответствии с большинством потребностей пользователей, так как теперь в день его нормально иметь многопоточное приложение.