web-dev-qa-db-fra.com

Configuration correcte du pool de connexions à la base de données database.yml pour les applications à un seul thread Rails

Je me posais des questions sur le paramètre suivant dans le Rails database.yml:

Par défaut, le nombre de connexions à la base de données pour le pool de connexions d'ActiveRecord est défini sur 5:

development:
  ...
  pool: 5

Mais par défaut, Rails 3 est un thread unique. Pourquoi auriez-vous besoin de 5 connexions par défaut?

Pour autant que je comprends, une seule application Rails ne peut pas déclencher plusieurs opérations de base de données à la fois, pourquoi auriez-vous besoin de garder plus de connexions ouvertes?

Je suppose que 2 connexions auraient du sens, donc vous avez toujours une connexion active même si l'autre expire, mais la détention de cinq connexions me semble un peu étrange.

Suis-je en train de manquer quelque chose?

MISE À JOUR Si quelqu'un d'autre est curieux, je viens de trouver un commit qui l'explique: https://github.com/Rails/rails/commit/b700153507b7d539a57a6e3bcf03c84776795051

En fait, ces paramètres par défaut n'ont aucun sens, ils ont été corrigés mais sont ensuite revenus temporairement (il y a un an) à cause de la suite de tests.

34
chris_b

Assez tard pour la fête ici, mais j'ai manqué de connexions à la base de données aujourd'hui en production.

Comme beaucoup de gens, j'utilise Sidekiq pour effectuer des tâches asynchrones comme l'envoi d'emails par exemple. Il est important de noter que Sidekiq fonctionne comme un processus multithread.

Donc, je n'ai pas juste une application Rails single-threaded), donc cette réponse ne s'applique pas directement à la question posée mais j'ai pensé qu'il valait la peine de dire quelque chose ici comme je pense que les applications multithreads Rails sont relativement normales de nos jours.

Cela signifie que vous devez ajuster la taille de votre pool de manière à créer suffisamment de connexions pour gérer tous les travaux pouvant être mis en file d'attente et prendre plus de 5 secondes (délai d'expiration par défaut pour attendre une connexion à la base de données avant de lancer une erreur).

18
djb

Gérer les connexions

Le principal avantage du regroupement de connexions pour un serveur à un seul thread comme Mongrel/Passenger/etc est que la connexion est établie/maintenue dans un gestionnaire de rack en dehors du traitement de demande principal Rails. Cela permet un connexion à établir une fois par rapport à plusieurs fois car elle est utilisée de différentes manières. Le but est de réutiliser la connexion établie et de minimiser le nombre de connexions. Cela devrait éviter d'avoir à se reconnecter dans un cycle de traitement de demande donné et peut-être même entre les demandes (si je me souviens bien).

Connexions simultanées multiples

Bien que la plupart des cas d'utilisation (Mongrel/Passenger) soient à un seul thread et ne peuvent utiliser qu'une seule connexion à la fois - il existe JRuby et des environnements/serveurs d'applications qui prennent en charge la totalité des threads. Rails est sans thread depuis 2.2

  • Le regroupement de connexions est géré à l'intérieur d'ActiveRecord, donc tous les serveurs d'applications doivent se comporter essentiellement de la même manière.

  • Le pool de connexions à la base de données démarre vide et crée des connexions au fil du temps en fonction de la demande. La taille maximale de ce pool par défaut est 5 et est configurée dans database.yml.

  • Les demandes et les utilisateurs partagent les connexions de ce pool. Une demande extrait une connexion la première fois qu'elle a besoin d'accéder à la base de données, puis réintègre la connexion à la fin de la demande.

  • Si vous utilisez Rails.threadsafe! , plusieurs threads peuvent accéder à plusieurs connexions en même temps. Par conséquent, en fonction de la charge de la demande, plusieurs threads peuvent s'affronter pour quelques connexions.

Vous pouvez changer en conséquence, si vous utilisez une application à thread unique. La valeur par défaut est 5 selon les besoins de la plupart des utilisateurs, comme il est désormais normal d'avoir une application multithread.

7
Gopal S Rathore