- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道在 sqlalchemy
中关闭所有 mysql 连接的正确方法是什么。对于上下文,它是一个 Flask 应用程序,所有 View 共享相同的 session
对象。
engine = create_engine("mysql+pymysql://root:root@127.0.0.1/my_database")
make_session = sessionmaker(bind=engine, autocommit=False)
session = ScopedSession(make_session)()
当应用程序被拆除时,session
关闭并且 engine
被释放
session.close()
engine.dispose()
但是根据数据库日志,我仍然有很多错误,例如 [Warning] Aborted connection 940 to db: 'master' user: 'root' host: '172.19.0.7' (Got an error reading communication数据包)
。
我尝试了一些解决方案,包括调用 gc.collect()
和 engine.pool.dispose()
但没有成功......
我怀疑后台引擎仍然打开了一些连接,需要关闭它们。有没有列出引擎打开的所有 session /连接?
在这上面花了很多时间之后,任何建议/帮助/指针将不胜感激!谢谢。
P.S:dispose
和 close
调用的灵感来自 How to close sqlalchemy connection in MySQL .顺便说一句,什么是“ checkout ”连接?
最佳答案
这可能无法完全回答您的问题,但我一直在使用这种方法来确保我的所有 session 都已关闭。每个使用 session 的函数都会得到 provide_session 装饰器。请注意必须存在 session=None
参数。
例如
@provide_session()
def my_func(session=None):
do some stuff
session.commit()
我在 Incubator-Airflow 项目中看到它的使用,非常喜欢它。
import contextlib
from functools import wraps
...
Session = ScopedSession(make_session)
@contextlib.contextmanager
def create_session():
"""
Contextmanager that will create and teardown a session.
"""
session = Session()
try:
yield session
session.expunge_all()
session.commit()
except:
session.rollback()
raise
finally:
session.close()
def provide_session(func):
"""
Function decorator that provides a session if it isn't provided.
If you want to reuse a session or run the function as part of a
database transaction, you pass it to the function, if not this wrapper
will create one and close it for you.
"""
@wraps(func)
def wrapper(*args, **kwargs):
arg_session = 'session'
func_params = func.__code__.co_varnames
session_in_args = arg_session in func_params and \
func_params.index(arg_session) < len(args)
session_in_kwargs = arg_session in kwargs
if session_in_kwargs or session_in_args:
return func(*args, **kwargs)
else:
with create_session() as session:
kwargs[arg_session] = session
return func(*args, **kwargs)
return wrapper
关于python - 如何在 sqlalchemy 中正确关闭 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48213032/
我是一名优秀的程序员,十分优秀!