当前位置: 首页 > 面试题库 >

处理MongoDB与Node断开连接/重新连接的问题

傅玮
2023-03-14
问题内容

当我的MongoDB连接空闲几分钟后,下一个请求将错误结束。从mongo命令行客户端,它看起来像这样:

> db.users.find()
Sat Jan 12 23:42:35 Socket recv() errno:54 Connection reset by peer 107.22.25.25:47207
Sat Jan 12 23:42:35 SocketException: remote: 107.22.25.25:47207 error: 9001 socket exception [1] server [107.22.25.25:47207] 
Sat Jan 12 23:42:35 DBClientCursor::init call() failed
Sat Jan 12 23:42:35 query failed : chowology.users {} to: ds047207.mongolab.com:47207
Error: error doing query: failed
Sat Jan 12 23:42:35 trying reconnect to ds047207.mongolab.com:47207
Sat Jan 12 23:42:35 reconnect ds047207.mongolab.com:47207 ok

我看到针对MongoHQ和MongoLab的沙箱实例的问题。

由于重新连接,下一个请求通过正常。这是我的网络应用程序中的一个问题,因为几分钟不活动后,在网络请求期间将出现此错误。有两件事让我感到惊讶:

  1. MongoDB连接被如此频繁和频繁地破坏,并且
  2. 驱动程序只是引发一个异常,而不是在重新连接后自动重试(我正在使用connect-mongo,该连接使用mongoose,而mongoose依次使用node-mongodb-native)。

这是其他所有人的经验吗?应该如何处理?如果应用程序开发人员将其数据库操作包装在一些重试异常处理废话中,我会感到惊讶。


问题答案:

您想查看服务器对象的文档

http://mongodb.github.com/node-mongodb-native/api-
generation/server.html#server

尤其是其中可以设置keepAlive和连接超时的socketOptions。默认情况下,keepalive关闭并且超时为0或从不,这意味着os默认套接字超时有效(从os到os有所不同)。保持活动状态会在tcp套接字连接下不时发送一次数据包,以使其保持活动状态。有时,防火墙配置错误,并且在关闭连接时不会发送结束数据包,从而使连接死机且陷入混乱,这就是人们一直在谈论的monoglabs(通常来说,它们配置得很糟糕)。



 类似资料:
  • 问题内容: StackExchange.Redis的“ 基本用法”文档解释说,该方法是长期存在的,有望重新使用。 但是,当与服务器的连接断开时该怎么办?是否自动重新连接,或者是否有必要像此答案一样编写代码(引用该答案): 上面的代码是处理断开连接恢复的好方法,还是实际上会导致多个实例?同样,该属性应如何解释? [另外:我相信上面的代码是惰性初始化的一种非常糟糕的形式,尤其是在多线程环境中-请参阅

  • 我已经使用Spring集成了MongoDB,我的数据服务有一个自动连接的mongo存储库,一切都正常。启动期间db关闭时除外。 当mongo关闭而服务启动时,初始化期间会引发异常,在这种情况下,整个服务无法启动。这显然不是我想要的。 我希望发生的是捕获异常并启动服务,并优雅地处理数据库可用性问题(例如显示一个页面,说明我们遇到了临时问题,使用缓存或其他任何东西) 我的存储库类: 我的服务等级: 和

  • 例外情况: com.health.dao.医院道义mpl.find医院邮编

  • 我正在尝试设置Kafka Connect,目的是运行Elasticsearch chSinkConntor。 Kafka安装程序,由3个使用Kerberos、SSL和ACL保护的代理程序组成。 到目前为止,我一直在尝试使用docker/docker-com的连接器运行连接框架和elasticserch-server本地化(使用Kafka 2.4连接到远程kafka安装(Kafka 2.0.1-实际

  • 问题内容: 我使用和创建一个实时Web应用程序。我将为用户提供对套接字连接的完全控制,例如手动断开连接和(重新)连接。 在客户端启动时,该功能可以正常运行,但是在使用之后,不会启动新连接。 问题答案: 现在可以使用socket.socket.reconnect() 相关:https : //github.com/LearnBoost/socket.io- client/issues/251

  • 问题内容: 大家好。我有一个使用ServerSocket和Socket类用Java编写的服务器。 我希望能够检测并处理断开连接,然后在必要时重新连接新客户端。 检测客户端断开连接,关闭套接字然后接受新客户端的正确步骤是什么? 问题答案: 大概是在从套接字读取数据,也许是在输入流上使用包装器,例如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于原始read()调用)或为nu