我正在使用 Flask-SQLAlchemy 1.0、Flask 0.10、SQLAlchemy 0.8.2 和 Python 2.7.5。我正在使用 Oracle 的 MySQL 连接器/Python 1.0.12 连接到 MySQL 5.6。
当我重新启动我的 Web 服务器(Apache2 或 Flask 的内置服务器)时,我OperationalError: MySQL Connection not available
在 MySQLwait_timeout
过期(默认 8 小时)后收到异常。
我发现有类似问题的人并明确设置SQLALCHEMY_POOL_RECYCLE = 7200
了 ,即使那是Flask-SQLAlchemy 的默认值。当我在此处session.remove()
设置断点时,我看到在每次请求后成功调用了拆解函数。有任何想法吗?
2014 年 7 月 21 日更新:
由于这个问题继续受到关注,我必须补充一点,我确实尝试了一些建议。我的两个尝试如下所示:
第一的:
@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
为了进一步确保我没有错过任何提交调用,我制作了一个 Flask 包装器,它启用了以下代码(如果我没记错的话):
@managed_session()
def hello(self):
model = Model(prop=value)
db.session.add(model)
return render_template(...
不幸的是,这两种方法都不起作用。我还记得尝试发出 SELECT(1) 调用以尝试重新建立连接,但我不再拥有该代码。
对我来说,底线是 MySQL/SQL Alchemy 有问题。当我迁移到 Postgres 时,我不必担心我的提交。一切都刚刚好。