ActiveRecord:: Connectiontimeouterro happening sporadically
chaque fois que j'ai une application utilisant ActiveRecord j'obtiens ce ConnectionTimeoutError-mais toujours après une certaine période inconnue de temps
ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5 seconds. The max pool size is currently 30; consider increasing it.):
Il était précédemment fixé à 5, nous avons déjà augmenté, et il n'y a aucun moyen de l'aide de 30 connexions en même temps. La seule chose pour laquelle nous utilisons ActiveRecord est notre session store.
notre base de données.fichier yml ressemble à:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 30
timeout: 5000
<!-(Les paramètres de Test et de production sont les suivants: même)
j'ai cherché sur Google cet événement, et je viens de tomber sur cet affichage:
https://groups.google.com/forum/#!msg/copenhagen-ruby-user-group/GEHgi_WudmM/gnCiwWqmVfMJ
qui mentionne que ActiveRecord ne vérifie pas une connexion de nouveau dans la piscine une fois qu'il est fait avec elle?? Est-ce vrai? Ai-je besoin pour gérer manuellement les connexions?
j'apprécie tout des conseils!!
modifier je devrais probablement mentionner que je suis en cours d'exécution Rails 3.1.3
4 réponses
les Rails ont un middleware appelé ActiveRecord::ConnectionAdapters::ConnectionManagement
qui efface les connexions actives de toutes les requêtes pour qu'elles ne restent pas dans les parages. Vérifiez votre middleware pour vous assurer que vous avez ceci (qui est là par défaut), lancez "rake middleware". Vous ne devriez pas avoir à gérer les connexions manuellement pour répondre à votre dernière question.
Exécuter dans votre console
ActiveRecord::Base.clear_active_connections!
j'ai utilisé ce code sur mon application Sinatra
after do
ActiveRecord::Base.clear_active_connections!
end
C'résoudre mon problème
S'applique aussi aux Rails 5, Puma étant le serveur par défaut.
si vous utilisez des serveurs threadés comme Puma, Phushion Passenger, ils créent plusieurs threads de la même application. Ainsi, votre application tourne plus rapidement, en exécutant simultanément chaque requête entrante.
assurez-vous que la taille du pool est égale ou supérieure au nombre de threads. J'ai eu un problème lors de quelques-uns de mes fils me donnaient ActiveRecord::ConnectionTimeoutError
, et le problème a été vague, car il se produit de temps en temps pas très souvent.
je rencontrais aussi un problème similaire avec une application Sinatra, j'ai ajouté
after do
ActiveRecord::Base.clear_active_connections!
end
À mon contrôleur d'application et il a résolu mon problème.
cette construction est connue sous le nom de filtre et elle est évaluée après chaque requête.
Je ne suis pas sûr de ce qui se passait réellement avec l'application, mais je suspecterais que les connexions n'étaient pas fermées après chaque demande.