2021 Uwaga: Oryginalna odpowiedź pochodzi z 2010 roku. Teraz lepszym podejściem, jak wskazano w komentarzach, wydaje się być używanie parametr pool_recycle .
Następuje oryginalna odpowiedź z 2010 roku.
Zobacz EDIT na dole, aby zobaczyć testowane rozwiązanie
Nie próbowałem, ale może używając Odbiornik basenu jest droga?
Możesz zrobić coś takiego:
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()])
W ten sposób za każdym razem, gdy połączenie ma zostać pobrane z puli, sprawdzamy, czy rzeczywiście jest połączone z serwerem. Jeśli nie, dajemy sqlalchemy jedną szansę na ponowne połączenie. Następnie, jeśli problem nadal występuje, odpuszczamy.
PS:Nie testowałem, czy to działa.
Edycja:Jeśli chodzi o Pylony, modyfikacje inicjalizacji silnika pokazane powyżej musiałyby być wykonane w your_app.model.init_model (Pylons 0.9.7) lub your_app.config.environment.load_environment (Pylony 1.0) funkcja - to są to są miejsca miejsce, w którym tworzona jest instancja silnika.
EDYTUJ
Ok. Udało mi się odtworzyć opisaną sytuację. Powyższy kod wymaga pewnych zmian, aby działał. Poniżej znajduje się, jak należy to zrobić. Nie ma również znaczenia, czy jest to 0.9.7 czy 1.0.
Musisz edytować your_app/config/environment.py. Umieść te eksporty na górze pliku:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
A koniec funkcji load_environment powinien wyglądać tak:
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)
Tym razem udało mi się to przetestować (na Pylons 1.0 + SQLAlchemy 0.6.1) i działa. :)