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

20
demandé sur Krista 2012-08-21 01:31:08

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!
12
répondu Kyle C 2013-11-05 07:55:37

j'ai utilisé ce code sur mon application Sinatra

after do
  ActiveRecord::Base.clear_active_connections!
end   

C'résoudre mon problème

1
répondu user3632955 2014-05-13 14:32:55

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.

1
répondu Ronak Jain 2016-02-06 12:33:12

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.

1
répondu TheGrassIsAlwaysMondegreen 2017-01-17 19:03:27