在研究Python web应用程序的一些奇怪问题(特别是MongoDB连接方面的问题)时,我注意到了一些问题.我的web应用程序使用Flask,但这不应该影响我面临的问题.

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

它声明(关于AutoReconnect异常):

为了自动重新连接,您必须处理此异常,识别

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

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

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

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

推荐答案

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

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

Mongodb相关问答推荐

如何使用MongoDB对子文档进行条件投影?

如何在MongoSH中的现有文档中插入字段

对对象数组进行分组并在 mongodb 中获取计数

MongoDB:从开始日期和结束日期数组中匹配特定日期的聚合查询

MongoDB 将 JSON 字符串转换为数组[{obj1},{obj2}]的实际对象

MongoDB 到 Snowflake 连续加载

Mongo 删除最后的文件

$eq 的目的是什么

Mongo C#忽略属性

Meteor 方法与deny/allow 规则

看起来当我执行 fs.writeFile() 时,更改的文件会重新启动 nodemon.怎么让它不重启?

MongoDB:按标签获取文档

oplog 在独立 mongod 上启用,不适用于副本集

Mongo 重启错误 -- /var/run/mongodb/mongod.pid 存在

MongoDB展开多个数组

如何在array.NET驱动程序中的元素属性上创建MongoDB MultiKey索引

MongoDB Java API:put() 与 append()

是否有支持 MongoDB 和 Devise 的 Rails 管理界面?

Mongo聚合框架,排序然后分组不起作用

如何在mongoose的嵌套填充中 Select 特定字段