8
votes

Activerecord :: ConnectionTyreuRror

Je reçois cette erreur:

ActiveRecord::Base.establish_connection ({
    :adapter => 'mysql2',
    :database => 'ck',
    :host => 'localhost',
    :username => 'root',
    :password => '',
    :pool => 16,
    })


0 commentaires

4 Réponses :


5
votes

On dirait que vous ne retournez pas les connexions à la piscine à la fin de la demande. Sinon, chaque demande que chaque demande utilise la base de données consomme 1 connexion et, éventuellement, vous allez épuiser la piscine et commencerez à obtenir les messages d'erreur que vous décrivez

Active Record fournit un middleware de rack pour gérer ce activerecord :: CoDraDapters :: ConnectionManagement , qui devrait s'occuper des choses aussi longtemps que celles-ci dans la chaîne middleware que tout ce qui accédera à un enregistrement actif.

Vous pouvez également prendre soin de la gestion de la connexion vous-même. Docs Avoir plus de détails mais une façon de le faire consiste à coller tous Votre DB Accède dans un bloc comme celui-ci xxx

qui vérifie une connexion au début du bloc et vérifie-t-elle ensuite.


3 commentaires

Merci. Devrais-je appeler cela avant Activerecord :: base.establish_connection?


C'est la première chose que j'appelle dans mon script, mais j'ai toujours la même erreur :(


Qu'entendez-vous par «l'appelant»? L'ajoutez-vous à la pile middleware? (Les Documents Sinatra ont des exemples IIRC)



12
votes

Comme Frederick a souligné que vous devez renvoyer des connexions ouvertes ActiveRecord sur le pool de connexion.

Si vous utilisez le serveur mince, en mode fileté, vous devez ajouter ceci à votre application SINATRA: p>

after do
  ActiveRecord::Base.connection.close
end


2 commentaires

@squixy - Mettez ceci dans n'importe quelle classe de votre application s'étend sinatra :: base


Y a-t-il une raison pour laquelle vous utilisez activerecord :: base.connection.close au lieu de activeCord :: base.clear_active_connections! comme spécifié dans le Docs ? Est-ce simplement obsolète?



1
votes

Il est préférable d'utiliser Middleware fourni avec ActiveRecord:

use ActiveRecord::ConnectionAdapters::ConnectionManagement


0 commentaires

0
votes

Comme Frederick a souligné que vous devez renvoyer des connexions ouvertes ActionCord sur le pool de connexion.

Comme Kuwerty suggère, lorsque vous utilisez mince, ConnectionManagement ne retournera pas les connexions à la piscine. Je suggère qu'au lieu de fermer la connexion actuelle comme Kuwerty, vous retournez la connexion à la piscine comme. xxx

pour ceux qui veulent reproduire le problème, essayez Cet exemple .

EDIT:

J'ai expliqué pourquoi utiliser Middleware ActiveRecord :: Connectadadapters :: ConnectionManagement ne fonctionnera pas avec mince en mode fileté, que vous pouvez trouver ici .


0 commentaires