Originale: Recentemente ho iniziato a ottenere MySQL OperationalErrors da alcuni dei miei vecchi codici e non riesco a rintracciare il problema. Dato che funzionava prima, pensavo che potesse trattarsi di un aggiornamento software che ha rotto qualcosa. Sto usando Python 2.7 con django runfcgi con nginx. Qui è il mio codice originale:Python e Django OperationalError (2006, 'server MySQL è andato via')
views.py
DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
db = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
cursor = db.cursor()
def list(request):
statement = "SELECT item from table where selected = 1"
cursor.execute(statement)
results = cursor.fetchall()
Ho provato quanto segue, ma ancora non funziona:
views.py
class DB:
conn = None
DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
def connect(self):
self.conn = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
def cursor(self):
try:
return self.conn.cursor()
except (AttributeError, MySQLdb.OperationalError):
self.connect()
return self.conn.cursor()
db = DB()
cursor = db.cursor()
def list(request):
cursor = db.cursor()
statement = "SELECT item from table where selected = 1"
cursor.execute(statement)
results = cursor.fetchall()
Attualmente, la mia unica soluzione è eseguire MySQLdb.connect()
in ciascuna funzione che utilizza mysql. Inoltre, ho notato che quando si utilizzava il django manage.py runserver
, non avrei questo problema mentre nginx lanciava questi errori. Dubito che sto scadendo con la connessione perché list()
viene chiamato entro pochi secondi dall'avvio del server. Ci sono stati aggiornamenti al software che sto usando che potrebbero causare l'interruzione/c'è qualche soluzione per questo?
Modifica: mi sono reso conto che di recente ho scritto un pezzo di middleware per demonizzare una funzione e questa era la causa del problema. Tuttavia, non riesco a capire perché. Ecco il codice per la middle-ware
def process_request_handler(sender, **kwargs):
t = threading.Thread(target=dispatch.execute,
args=[kwargs['nodes'],kwargs['callback']],
kwargs={})
t.setDaemon(True)
t.start()
return
process_request.connect(process_request_handler)
Hai una funzione locale chiamata 'lista'? Questa è una cattiva idea – hughdbrown
In alcuni adattatori/librerie di database esiste un'impostazione per riconnettersi automaticamente, in modo simile a come il client mysql gestisce i timeout. Dai un'occhiata se puoi configurarlo. –