关于 sqlalchemy 与 mariadb 连接的一个问题

2022-04-07 11:34:56 +08:00
 Frankcox

我在项目中使用 sqlalchemy 提供的 ORM 与数据库(mariadb)进行交互,使用以下方法进行 Engine 与 SessionFactory 的管理:

SQL_CONNECT = "................."

SessionFactory = None

def get_session():
    global SessionFactory
    if SessionFactory is None:
        try:
            _db_Engine = create_engine(SQL_CONNECT + "?charset=utf8",
                                       echo=False, encoding='utf-8')
            SessionFactory = sessionmaker(bind=_db_Engine)
            session = scoped_session(SessionFactory)
            return session
        except Exception as _expt:
            ……
    else:
        try:
            session = scoped_session(SessionFactory)
            return session
        except Exception as _expt:
            ………

在后续的使用 Session 使用中,使用 with 上下文进行对 Session 的控制:

Session = get_session()
with Session() as session:
  .....

但是在经过了清明假期三天,期间无人调用相关接口,回来后再调用时,发现部分接口连接报错:

(pymysql.err.OperationalError) (2006, "MySQL server has gone away (error(32, 'Broken pipe'))")

查了相关资料,原因好像是连接空置时间过长,mariadb 侧关闭了连接,而 sqlalchemy 侧还没有关闭导致。于是在create_engine中手动加了参数pool_recycle=300pool_pre_ping=True, 目前暂时没复现上述问题。 但是在我查看一个开源社区其他项目的源码中(该项目与我的连接的是一个数据库),发现该项目并没有指定 recycle 与 pre ping ,长时间空置后却并不会出现 2006 的错误,想知道这里的问题是什么?

项目代码: https://github.com/openstack/barbican/blob/master/barbican/model/repositories.py

530 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/845440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX