Possiedo un demone che utilizza sqlalchemy per interagire con il database MySQL. Poiché l'interazione è rara, le connessioni tendono a scadere. Ho provato a risolvere il problema impostando vari flag durante la creazione del motore di database, ad es. pool_recycle=3600
, ma nulla sembra aiutare.sqlalchemy + timeout di connessione MySQL
Per aiutarmi a risolvere il problema, ho impostato il timeout del mio server mysql locale su 10 secondi e ho provato il seguente programma.
import time
import sqlalchemy
engine = sqlalchemy.engine.create_engine("mysql://localhost")
while True:
connection = engine.connect()
result = connection.execute("SELECT 1")
print result.fetchone()
connection.close()
time.sleep(15)
Sorprendentemente, io continuo a ottenere eccezioni come il seguente:
sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away')
Tuttavia, se mi tolgo la chiamata al connection.close()
, il problema va via. Che cosa sta succedendo qui? Perché sqlalchemy non sta tentando di stabilire una nuova connessione ogni volta che chiamo connect()
?
Sto usando Python 2.7.3 con sqlalchemy 0.9.8 e MySQL 5.5.40.
Un aggiornamento per coloro che sono interessati: l'unica cosa che ha funzionato finora è il monitoraggio dello script con Upstart di Ubuntu. Quando il daemon si arresta in modo anomalo a causa del timeout, Upstart lo riavvia. Questa non è la soluzione più aggraziata, ma avevo comunque bisogno che il monitoraggio dei processi fosse a posto, quindi c'è questo. – Tom