V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Frankcox
V2EX  ›  问与答

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

  •  
  •   Frankcox · 2022-04-07 11:34:56 +08:00 · 530 次点击
    这是一个创建于 916 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在项目中使用 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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1233 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:28 · PVG 07:28 · LAX 16:28 · JFK 19:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.