2014-12-15 21 views
6

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.

+0

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

risposta

2

Non sono sicuro al 100% se questo risolverà il problema o meno, ma ho riscontrato un problema simile quando si tratta di mysql. È stato corretto solo quando ho usato pymysql per connettermi al database.

È possibile installare in questo modo:

pip install pymysql 

che lavorerà sia per Linux che per Windows (se lo avete installato)

poi dare la stringa di connessione in questo modo:

import time 
import sqlalchemy 

engine = sqlalchemy.engine.create_engine("mysql+pymysql://localhost") 

while True: 
    connection = engine.connect() 
    result = connection.execute("SELECT 1") 
    print result.fetchone() 
    connection.close() 
    time.sleep(15) 

Ottengo il seguente output quando lo eseguo:

(1,) 
(1,) 
(1,) 
(1,) 

In un'altra nota, ho trovato alcune query interrotte con SQLAlchemy 0.9.8. Ho dovuto installare la versione 0.9.3 affinché le mie applicazioni non si rompessero più.

+0

Grazie per le informazioni - ci proverò! – Tom

+0

Questo lavoro ha funzionato? – CodeLikeBeaker

3

the document mention:

MySQL offre una connessione stretta comportamento automatico,
per le connessioni che sono state inattive per otto ore o più. Per aggirare avere questo problema, utilizzare l'opzione pool_recycle che controlla l'età massima di qualsiasi connessione:

motore = create_engine ('mysql + mysqldb: // ...', pool_recycle = 3600)

È possibile inserire il parametro "pool_recycle" quando viene richiamato il metodo_rigina.

+0

Questa è la risposta giusta –