2012-01-11 5 views
16

Ho un'applicazione web Flask che utilizza SQLAlchemy con MySQL e ho impostato un ambito(). Ho anche un gestore di teardown_request che chiama session.remove() al termine di ogni richiesta. Per qualche strana ragione, se non vengono fatte richieste sull'app Web per un giorno o più, l'app ottiene "Operationalerror: MySQL Server è andato via".È strano che la mia connessione SQLAlchemy MySQL finisca sempre per dormire?

nella mia missione di debug, ho guardato SHOW PROCESSLIST e ha presentato le seguenti:

39817253 | sqladmin | my_host | kb_dev | Sleep | 174 | 

Il 174 è il numero di secondi che il collegamento dalla mia domanda è stata "dormendo". Continua a contare se l'applicazione non fa un'altra richiesta.

Sembra che la mia applicazione mantenga la connessione a MySQL anche dopo che la mia richiesta è terminata! E di solito c'è solo un processo, non importa quante richieste faccio con la mia applicazione, simultaneamente o meno.

La mia domanda è se è normale che la connessione "stia dormendo" così a lungo? Sono abbastanza sicuro che il sonno prolungato sta causando a MySQL il taglio della connessione dopo un certo timeout che a sua volta causa l'errore "OperationalError: Mysql è andato via".

+0

Hai risolto il problema? L'impostazione di pool_recycle non funziona per me. –

risposta

23

comportamento predefinito di SQLAlchemy è quello di raggruppare le connessioni all'interno del motore:

http://www.sqlalchemy.org/docs/core/engines.html

http://www.sqlalchemy.org/docs/core/pooling.html

Per quanto riguarda la cosa durante la notte disconnessione, questo è un comportamento MySQL noto, SQLAlchemy fornisce la bandiera pool_recycle a lavorarci intorno Qui ci sono molti link che lo descrivono:

http://www.sqlalchemy.org/docs/dialects/mysql.html#connection-timeouts

http://www.sqlalchemy.org/docs/core/pooling.html#setting-pool-recycle

http://www.sqlalchemy.org/docs/core/engines.html#sqlalchemy.create_engine (pool_recycle)

http://www.sqlalchemy.org/trac/wiki/FAQ#MySQLserverhasgoneaway

Blog post dal solo pochi giorni fa:

http://douglatornell.ca/blog/2012/01/08/staying-alive/

+0

Grazie a zzzeek, ​​tutto ha senso ora. Non avevo idea che il pool di connessioni fosse abilitato di default. Ma sembra che proverò ora l'opzione pool_recycle. – trinth

+0

@tron sei riuscito a risolvere il tuo problema? Sto affrontando lo stesso. – giga

+0

@giga è passato un po 'di tempo ma credo che l'opzione pool_recycle abbia risolto il problema per me – trinth

Problemi correlati