См. РЕДАКТИРОВАТЬ внизу для протестированного решения
Я не пробовал, но, возможно, с помощью PoolListener это способgo?
Вы можете сделать что-то вроде этого:
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()])
Таким образом, каждый раз, когда соединение собирается проверяться из пула, мы проверяем, действительно ли оно подключено к серверу.Если нет, мы даем sqlalchemy один шанс восстановить соединение.После этого, если проблема все еще существует, мы отпускаем ее.
PS: я не проверял, работает ли это.
Редактировать: Что касается пилонов, изменения в инициализации двигателя показаливыше должно быть сделано в your_app.model.init_model (Pylons 0.9.7) или your_app.config.environment.load_environment (Pylons 1.0) функция - это это места места, где создается экземпляр движка.
EDIT
ОК.Я смог воспроизвести описанную ситуацию.Код выше нуждается в некоторых изменениях, чтобы работать.Ниже описано, как это сделать.Также не имеет значения, 0.9.7 или 1.0.
Вам необходимо отредактировать your_app / config / environment.py.Поместите эти экспорты в начало файла:
import sqlalchemy
import sqlalchemy.interfaces
import _mysql_exceptions
И конец функции load_environment должен выглядеть следующим образом:
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)
На этот раз я смог протестировать его (на Pylons 1.0+ SQLAlchemy 0.6.1) и это работает. :)