2021 Opmerking: Het oorspronkelijke antwoord is van 2010. Nu lijkt de betere aanpak, zoals aangegeven in de opmerkingen, het gebruik van het gebruik van pool_recycle parameter .
Origineel antwoord uit 2010 volgt.
Zie BEWERKEN onderaan voor geteste oplossing
Ik heb het niet geprobeerd, maar misschien met behulp van PoolListener is een manier om te gaan?
Je zou zoiets als dit kunnen doen:
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()])
Op deze manier testen we elke keer dat de verbinding wordt uitgecheckt uit de pool, of deze daadwerkelijk is verbonden met de server. Zo niet, dan geven we sqlalchemy één kans om opnieuw verbinding te maken. Daarna, als het probleem er nog steeds is, laten we het los.
PS:ik heb niet getest of dit werkt.
Bewerken:wat betreft de pylonen, wijzigingen aan de hierboven getoonde engine-initialisatie moeten worden gedaan in your_app.model.init_model (Pylons 0.9.7) of your_app.config.environment.load_environment (Pylonen 1.0) functie - dit zijn dit zijn de plaatsen plaats waar de engine-instantie wordt gemaakt.
BEWERKEN
Ok. Ik kon de beschreven situatie reproduceren. De bovenstaande code heeft enkele wijzigingen nodig om te kunnen werken. Hieronder staat hoe het moet. Het maakt ook niet uit of het 0.9.7 of 1.0 is.
U moet uw_app/config/environment.py bewerken. Zet deze exports bovenaan het bestand:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
En het einde van de functie load_environment zou er zo uit moeten zien:
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)
Deze keer kon ik het testen (op Pylons 1.0 + SQLAlchemy 0.6.1) en het werkt. :)