使用MySQL数据库和flask-sqlalchemy我遇到丢失的连接错误('Lost connection to MySQL server during query'
)。我已经将app.config['SQLALCHEMY_POOL_RECYCLE']
调整为小于engine timeout
。我还添加了一个pool_pre_ping
,以确保数据库在两个请求期间不会消失。现在我不知道如何,这仍然是一个问题,因为我的理解是flask-sqlalchemy应该正确地处理开幕和闭幕会议。
作为一种解决方法,我想到了一种方法来告诉flask-sqlalchemy捕获丢失的连接响应并动态重新启动连接。但我不知道该怎么做。所以,我的问题是:
答案 0 :(得分:0)
我不知道第一个和第二个问题的答案,但是对于第三个问题,我使用修饰符来包装所有函数,而不是直接在函数内部使用try /。显式的pre_ping和会话回滚/关闭以某种方式也为我解决了丢失连接的问题(mariadb是我使用的后端)!
def manage_session(f):
def inner(*args, **kwargs):
# MANUAL PRE PING
try:
db.session.execute("SELECT 1;")
db.session.commit()
except:
db.session.rollback()
finally:
db.session.close()
# SESSION COMMIT, ROLLBACK, CLOSE
try:
res = f(*args, **kwargs)
db.session.commit()
return res
except Exception as e:
db.session.rollback()
raise e
# OR return traceback.format_exc()
finally:
db.session.close()
return inner
然后用装饰器包装我的函数:
@manage_session
my_funtion(*args, **kwargs):
return "result"