首页 > 解决方案 > 在 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() 方法实际上并没有关闭连接?

标签: pythonlinuxmongodbjupyter-notebook

解决方案


我在我们的生产环境中使用 MongoDB 已经有一段时间了,过去也遇到过这样的问题。 data = list(coll.find(query))这行代码实际上实现了光标返回的查询结果并导致连接保持活动状态。查询的结果是一个生成器,应该按原样在循环中使用。将光标具体化为 alist()会导致所有数据被拉入内存,导致它有时崩溃,而不是指向结果集中第一个条目的光标。

您可以简单地对光标执行以下操作:

for elem in cursor: do_something

并且不需要调用该close()方法

其次,使用 Jupyter Notebooks,您需要在完成工作后停止会话。除非这样做,否则 notebook 将始终保持与 MongoDB 的连接,沿途消耗资源。


推荐阅读