Ver EDITAR en la parte inferior para la solución probada
Yo no lo probamos, pero tal vez usando PoolListener es un camino a seguir?
se podría hacer algo como esto:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.info() # is there any better way to simply check if connection to mysql is alive?
except sqlalchemy.exc.OperationalError:
if self.retried:
self.retried = False
raise # we do nothing
self.retried = True
raise sqlalchemy.exc.DisconnectionError
# next, code according to documentation linked above follows
e = create_engine("url://", listeners=[MyListener()])
De esta manera cada conexión de tiempo está a punto de ser retirado de la piscina comprobamos si en realidad está conectado al servidor. Si no, le damos a sqlalchemy una oportunidad de volver a conectar. Después de eso, si el problema sigue ahí, lo dejamos ir.
PD: No he probado si esto funciona.
Editar: En cuanto a los pilones, las modificaciones a la inicialización del motor mostró anteriormente tendría que ser hecho en
your_app.model.init_model (Pilones 0.9.7) o
your_app.config.environment.load_environment
(Pilones 1.0)
función -
estos son
este es el
lugares
lugar donde se crea la instancia del motor.
EDITAR
Ok. Pude reproducir la situación descrita. El código anterior necesita algunos cambios para poder funcionar. A continuación se muestra cómo se debe hacer. Además, no importa si es 0.9.7 o 1.0.
Necesita editar su_app/config/environment.py. Poner estas exportaciones en la parte superior del archivo:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
Y el final de la función load_environment debe ser similar a lo siguiente:
class MyListener(sqlalchemy.interfaces.PoolListener):
def __init__(self):
self.retried = False
def checkout(self, dbapi_con, con_record, con_proxy):
try:
dbapi_con.cursor().execute('select now()')
except _mysql_exceptions.OperationalError:
if self.retried:
self.retried = False
raise
self.retried = True
raise sqlalchemy.exc.DisconnectionError
config['sqlalchemy.listeners'] = [MyListener()]
engine = engine_from_config(config, 'sqlalchemy.')
init_model(engine)
Esta vez tuve la oportunidad de probarlo (en los pilones 1.0 + SQLAlchemy 0.6. 1) y funciona. :)
Gracias, alma similar está aquí: http://www.mail-archive.com/[email protected]/msg15079.html y funciona para mí. – wRAR
No vi tu edición :) – wRAR
Nota para SQLAlchemy 0.7 - 'PoolListener' está en desuso, pero la misma solución se puede implementar usando el nuevo [sistema de eventos] (http://docs.sqlalchemy.org/en/latest/ core/pooling.html # disconnect-handling-pesimista). –