Poznámka 2021: Původní odpověď je z roku 2010. Nyní se zdá, že lepším přístupem, jak bylo zdůrazněno v komentářích, je použití pool_recycle param .
Následuje původní odpověď z roku 2010.
Otestované řešení naleznete v části UPRAVIT v dolní části
Nezkoušel jsem to, ale možná pomocí PoolListener je cesta?
Můžete udělat něco takového:
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()])
Tímto způsobem pokaždé, když se má připojení odhlásit z fondu, testujeme, zda je skutečně připojeno k serveru. Pokud ne, dáme sqlalchemy jednu šanci znovu se připojit. Poté, pokud problém přetrvává, necháme to být.
PS:Netestoval jsem, jestli to funguje.
Edit:Pokud jde o Pylony, úpravy inicializace motoru zobrazené výše by bylo nutné provést v your_app.model.init_model (Pylons 0.9.7) nebo your_app.config.environment.load_environment (Pylons 1.0) funkce - toto jsou toto jsou místa místo, kde se vytvoří instance motoru.
UPRAVIT
Dobře. Podařilo se mi reprodukovat popsanou situaci. Výše uvedený kód potřebuje nějaké změny, aby fungoval. Níže je uvedeno, jak by to mělo být provedeno. Také nezáleží na tom, zda je to 0.9.7 nebo 1.0.
Musíte upravit your_app/config/environment.py. Umístěte tyto exporty na začátek souboru:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
A konec funkce load_environment by měl vypadat takto:
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)
Tentokrát jsem to mohl otestovat (na Pylons 1.0 + SQLAlchemy 0.6.1) a funguje to. :)