Я использую Flask-SQLAlchemy 1.0, Flask 0.10, SQLAlchemy 0.8.2 и Python 2.7.5. Я подключаюсь к MySQL 5.6 с помощью Oracle MySQL Connector/Python 1.0.12.
Когда я перезапускаю свой веб-сервер (либо Apache2, либо Flask), я получаю исключение OperationalError: MySQL Connection not available
после истечения MySQL wait_timeout
(по умолчанию 8 часов).
Я нашел людей с схожие проблемы и явно установил SQLALCHEMY_POOL_RECYCLE = 7200
, хотя По умолчанию флажок-SQLAlchemy. Когда я помещаю точку останова здесь, я вижу, что функция teardown успешно вызывает session.remove()
после каждого запроса. Любые идеи?
Обновление 7/21/2014:
Поскольку этот вопрос продолжает получать внимание, я должен добавить, что я действительно пробовал некоторые из предложений. Две мои попытки выглядели следующим образом:
Во-первых:
@contextmanager
def safe_commit():
try:
yield
db.session.commit()
except:
db.session.rollback()
raise
Это позволило мне обернуть мои вызовы фиксации следующим образом:
with safe_commit():
model = Model(prop=value)
db.session.add(model)
Я на 99% уверен, что я не пропустил никаких вызовов db.session.commit
с этим методом, и у меня все еще были проблемы.
Второе:
def managed_session():
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
try:
response = f(*args, **kwargs)
db.session.commit()
return response
except:
db.session.rollback()
raise
finally:
db.session.close()
return decorated_function
return decorator
Чтобы еще больше убедиться, что я не пропускал никаких вызовов фиксации, я создал флеш-упаковку, которая включала код, например (если я правильно помню):
@managed_session()
def hello(self):
model = Model(prop=value)
db.session.add(model)
return render_template(...
К сожалению, ни один из методов не работал. Я также помню, как пыталась вызывать вызовы SELECT (1) в попытке восстановить соединение, но у меня больше нет этого кода.
Для меня, в сущности, MySQL/SQL имеет проблемы с Alchemy. Когда я перебрался в Postgres, мне не пришлось беспокоиться о моих намерениях. Все просто сработало.