我在项目中使用 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=300
与pool_pre_ping=True
, 目前暂时没复现上述问题。
但是在我查看一个开源社区其他项目的源码中(该项目与我的连接的是一个数据库),发现该项目并没有指定 recycle 与 pre ping ,长时间空置后却并不会出现 2006 的错误,想知道这里的问题是什么?
项目代码: https://github.com/openstack/barbican/blob/master/barbican/model/repositories.py
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.