【问题标题】:flask-sqlalchemy lost connection to MySQL dbflask-sqlalchemy 失去与 MySQL 数据库的连接
【发布时间】:2018-03-01 15:30:05
【问题描述】:

使用 MySQL 数据库和 flask-sqlalchemy 我遇到了丢失连接错误 ('Lost connection to MySQL server during query')。我已经将app.config['SQLALCHEMY_POOL_RECYCLE'] 调整为小于engine timeout。我还添加了pool_pre_ping,以确保数据库在两次请求期间不会消失。现在我不知道这仍然是一个问题,因为据我了解,flask-sqlalchemy 应该正确地处理打开和关闭会话。

作为一种解决方法,我想了一种方法来告诉 flask-sqlalchemy 捕获丢失的连接响应并即时重新启动连接。但我不知道该怎么做。所以,我的问题是:

  1. 您知道什么可能导致我的连接中断吗?
  2. 您认为我最近的捕捉方法是个好主意还是您有更好的建议?
  3. 如果这是一个好主意,我怎样才能最方便地做到这一点?我不想将所有请求都包装在 try-catch-statements 中,因为我有很多代码。

【问题讨论】:

  • 您在应用程序中使用多线程吗?什么样的mysql驱动?

标签: python mysql flask flask-sqlalchemy


【解决方案1】:

我不知道你的第一个和第二个问题的答案,但是对于第三个问题,我使用了一个装饰器来包装我的所有函数,而不是直接在函数内部使用 try / except。显式的 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"

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2016-04-22
    • 2018-06-13
    • 2019-03-30
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多