Django pleure ‘MySQL server has gone away’
lundi 13 octobre 2014 à 10:52Dans certaines circonstances, par exemple une transaction ouverte pendant trop longtemps, MySQL ferme la connexion avec son client.
Cela arrive par exemple quand on l’utilise comme broker pour celery. On a des tâches qui plantent, et quand on met du debug, on lit un (2006, 'MySQL server has gone away')
bien cryptique.
Généralement je recommande de changer de backend ici. Passer à redis pour cet usage par exemple.
Mais parfois on ne peut pas. La solution est alors de forcer Django à réinitialiser la connexion en la fermant. Il faut le faire au niveau où on a remarqué que la requête échouait. Dans notre cas, au début de chaque tâche celery :
from django.db import connection @task def do_stuff(): connection.close() # le reste du code |
Voyant la connexion fermée, Django va en ouvrir une nouvelle à la prochaine requête automatiquement.
Cela a, évidement, un impact sur les performances, donc choisissez bien entre mettre une rustine et changer la roue.