python - 在 Jupyter Lab 笔记本中使用 PyMongo 不会关闭与 MongoDB 服务器的任何连接
问题描述
因此,我使用Jupyter Lab notebook 连接到我们的生产数据库。经过几天的工作,我们注意到服务器如何显示数百个与数据库的活动连接,列为已建立(运行“ netstat -na ”)。
这非常糟糕,我们将问题确定为来自 python 内核打开与服务器的连接而实际上从未关闭它们,即使明确告知要这样做。
这是我们用来连接服务器的代码的修订版本,它自己在笔记本单元中运行,与其他代码分开。我们隔离了这个问题,我们确定它来自这些代码行:
client = MongoClient(url, maxIdleTimeMS=120000)
db = client["database"]
coll = db["data"]
query = # Our query
data = list(coll.find(query))
client.close()
为什么会这样?我们做错了什么?为什么 .close() 方法实际上并没有关闭连接?
解决方案
我在我们的生产环境中使用 MongoDB 已经有一段时间了,过去也遇到过这样的问题。
data = list(coll.find(query))
这行代码实际上实现了光标返回的查询结果并导致连接保持活动状态。查询的结果是一个生成器,应该按原样在循环中使用。将光标具体化为 alist()
会导致所有数据被拉入内存,导致它有时崩溃,而不是指向结果集中第一个条目的光标。
您可以简单地对光标执行以下操作:
for elem in cursor:
do_something
并且不需要调用该close()
方法
其次,使用 Jupyter Notebooks,您需要在完成工作后停止会话。除非这样做,否则 notebook 将始终保持与 MongoDB 的连接,沿途消耗资源。
推荐阅读
- acumatica - Acumatica - 在待批准状态下启用 AP 账单中的字段
- c++ - UE4 在 OnComponentBeginOverlap 上投射 OtherActor
- android-studio - 带有 Gradle 异常的 Android Studio Flutter 失败
- python - 随机砖颜色 - > TypeError:'pygame.Color'对象不可调用
- pandas - 迭代 500 多个镶木地板文件时出现内存错误
- powershell - Powershell脚本自动填充网站中的字段
- android - 如何使用 Hilt 模拟视图模型以进行单元测试片段?
- javascript - 如何根据用户先前的值设置默认值
- systemd - 使用 systemd 管理 Trackmania 服务器
- mysql - 从数据库中获取点的最近点