Подтвердить что ты не робот

Правильная настройка пула подключений базы данных database.yml для однопоточных приложений Rails

Мне было интересно узнать о следующей настройке в Rails database.yml:

По умолчанию количество подключений к базе данных для пула соединений ActiveRecord равно 5:

development:
  ...
  pool: 5

Но по умолчанию Rails 3 является однопоточным. Зачем вам нужно 5 подключений по умолчанию?

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

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

Я что-то пропустил?

UPDATE Если кому-то еще интересно, я просто нашел коммит, который объясняет это: https://github.com/rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051

Фактически эти настройки по умолчанию не имеют никакого смысла, они были исправлены, но затем временно возвращены (год назад) из-за набора тестов.

4b9b3361

Ответ 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 в соответствии с большинством потребностей пользователей, так как теперь в день его нормально иметь многопоточное приложение.