python - 为什么 PyMongo 会抛出 AutoReconnect?

标签 python mongodb pymongo

在研究我的 Python Web 应用程序的一些奇怪问题(特别是有关 MongoDB 连接的问题)时,我注意到了一些 on the official PyMongo documentation page .我的 Web 应用程序使用 Flask,但这不应该影响我面临的问题。

PyMongo 驱动程序执行连接池,但它也会在连接陈旧且重新连接到期时引发异常(AutoReconnect)。

它指出(关于自动重新连接异常):

In order to auto-reconnect you must handle this exception, recognizing that the operation which caused it has not necessarily succeeded. Future operations will attempt to open a new connection to the database (and will continue to raise this exception until the first successful connection is made).

我注意到这实际上经常发生(而且似乎不是错误)。连接似乎在几分钟不活动后被 MongoDB 服务器关闭,需要由 Web 应用程序重新创建。

我不明白为什么 PyMongo 驱动程序在重新连接时会抛出错误(驱动程序的用户需要自己处理),而不是透明地执行此操作。 (用户甚至可以设置一个选项,以便抛出 AutoReconnect 异常 do,但如果不抛出这些异常,这不是一个明智的默认设置全部,并且无缝地重新创建连接?)

我在使用其他数据库系统时从未遇到过这种行为,这就是为什么我有点困惑。

还值得一提的是,当连接到我的本地开发 MongoDB 服务器时,我的 Web 应用程序的 MongoDB 连接永远不会失败(我认为这与它是本地连接的事实有关,并且连接是通过 UNIX 完成的socket 而不是网络套接字,但我可能是错的)。

最佳答案

您误解了自动重新连接。当驱动程序尝试与服务器通信(发送命令或其他操作)并且发生网络故障或类似问题时会引发此问题。异常的名称旨在传达您不必创建 MongoClient 的新实例,当您的应用程序尝试下一个操作时,现有客户端将尝试自动重新连接。如果出现同样的问题,会再次引发 AutoReconnect。

我怀疑您看到套接字超时(并引发 AutoReconnect)的原因是服务器和您的应用程序之间存在负载平衡器,该负载平衡器在一段时间不活动后关闭连接。例如,这显然发生在 Microsoft 的 Azure 平台上,在套接字上 13 分钟没有事件后。您可以使用 PyMongo 2.8 中添加的 socketKeepAlive 选项来解决此问题。请注意,您还必须将应用程序服务器上的 keepalive 间隔设置为适当的值(Linux 上的默认值为 2 小时)。 See here for more information.

关于python - 为什么 PyMongo 会抛出 AutoReconnect?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28809168/

相关文章:

python - 将 Flask 路由参数传递给装饰器

python - 已知短语前后的正则表达式条件

mongodb - 当排序值相同时,Mongo 在 $skip 之后不会维持 $sort 顺序

c# - 未知鉴别器值 MongoDB

mongodb - flask、mongokit、pymongo、flask-pymongo是什么关系?

python - 仅使用 Django 的 DB 部分

python - 将输入语句连接到python中的函数

sql - 使用 NodeJS + MongoDB(或 SQL)实现搜索算法

python - 皮蒙戈 : to check if we have connected to MongoDB database

python - 如何使用 pymongo 写入/读取两个不同的 mongo 服务器(具有不同版本的 mongo 2.4 和 3.0.3)