È strano che la mia connessione SQLAlchemy MySQL finisce sempre per dormire?
-
27-10-2019 - |
Domanda
Ho un'applicazione web usando Flask SQLAlchemy con MySQL, e ho creato uno scopedsession (). Ho anche un gestore teardown_request che le chiamate session.remove () dopo ogni richiesta è finito. Per qualche strana ragione, se non richieste vengono effettuate sulla web app per un giorno o più, l'applicazione ottiene. "OperationalError: MySQL server è andato via"
Nella mia missione di debug, ho guardato SHOW PROCESSLIST e ho visto il seguente:
39817253 | sqladmin | my_host | kb_dev | Sleep | 174 |
Il 174 è il numero di secondi la connessione dalla mia domanda è stata "Sleeping". Si continua a contare su se l'applicazione non fa un'altra richiesta.
Sembra che la mia applicazione aggrappa alla connessione a MySQL anche dopo la mia richiesta è finito! E di solito c'è un solo processo indipendentemente dal numero di richieste che faccio con la mia domanda, simultaneamente o no.
La mia domanda è se è normale per la connessione di essere "dormire" così a lungo? Sono abbastanza sicuro che il sonno prolungato sta causando MySQL di tagliare la connessione dopo un certo timeout che a sua volta causa il "OperationalError: Mysql è andato via" errore.
Soluzione
il 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 disconnessione durante la notte, questo è un noto comportamento di MySQL, SQLAlchemy fornisce la bandiera pool_recycle al lavoro intorno ad esso. Qui ci sono molti link che lo descrivono:
http://www.sqlalchemy.org/docs/dialects/ mysql.html # connection-timeout
http://www.sqlalchemy.org/docs/ core / pooling.html # impostazione-piscina-riciclo
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: