2015-12-02 2 views
4

J'utilise flacon et peewee. Parfois, peewee jette cette erreurPeewee serveur MySQL est parti

MySQL server has gone away (error(32, 'Broken pipe')) 

connexion à la base Peewee

db = PooledMySQLDatabase(database,**{ 
      "passwd": password, "user": user, 
      "max_connections":None,"stale_timeout":None, 
      "threadlocals" : True 
     }) 

@app.before_request 
def before_request(): 
    db.connect() 

@app.teardown_request 
def teardown_request(exception): 
    db.close() 

Après erreur mysql que "serveur MySQL a disparu (erreur (32, 'Broken pipe'))", sélectionnez requêtes fonctionne sans problème , mais insérer, mettre à jour, supprimer des requêtes ne fonctionnent pas.

Lors de l'insertion, la mise à jour, supprimer des requêtes fonctionne derrière (dans mysql) mais peewee jeter ces erreurs.

(2006, "MySQL server has gone away (error(32, 'Broken pipe'))") 
+0

Avez-vous essayé avec un ' stale_timeout' set? La valeur par défaut est '300'. –

+0

@KlausD. J'ai essayé mais j'ai toujours la même erreur. Cette situation se produit lorsque je ferme et démarre mysql pendant l'exécution de flask. Aussi quand mysql baisse et redémarre lui-même. – Alexander

+0

C'est un problème habituel lors de l'utilisation de pools de connexions. Le moyen le plus simple de résoudre ce problème serait de redémarrer le serveur WSGI (ou de lancer Flask) avec votre serveur MySQL. De même, vous devriez redémarrer votre serveur MySQL de manière très rare, les serveurs de bases de données sont conçus pour être exécutés et non pour redémarrer. –

Répondre

4

La documentation pee-wee a parlé de ce problème, voici le lien: Error 2006: MySQL server has gone away

Cette erreur particulière peut se produire lorsque MySQL tue une connexion de base de données au ralenti. Cela se produit généralement avec les applications Web qui ne gèrent pas explicitement les connexions à la base de données. Ce qui se passe est que votre application démarre, une connexion est ouverte pour gérer la première requête qui s'exécute, et, puisque cette connexion n'est jamais fermée, elle reste ouverte, en attendant plus de requêtes.

Vous avez donc des problèmes de gestion de la connexion à votre base de données.


Puisque je ne peux pas reproduire votre problème, pourriez-vous s'il vous plaît essayer, fermez votre base de données de cette façon:

@app.teardown_appcontext 
def close_database(error): 
    db.close() 

Et vous pouvez obtenir quelques informations de la doc: Step 3: Database Connections

+0

J'ai essayé @ app.teardown_appcontext mais j'ai toujours la même chose – Alexander

3

Je sais que c'est une vieille question, mais comme il n'y a pas de réponse acceptée, j'ai pensé que j'ajouterais mes deux cents. J'ai eu le même problème lors de la validation de grandes quantités de données dans des objets Peewee (plus grand que la quantité de données que MySQL autorise dans un seul commit par défaut). Je l'ai corrigé en changeant la taille max_allowed_packet dans my.conf.

Pour ce faire, my.conf ouvert, ajoutez la ligne suivante sous [mysqld]:

max_allowed_packet=50M

... ou quelle que soit la taille dont vous avez besoin et redémarrez mysqld