4

当我的 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)。

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

4

3 回答 3

3

您想查看 Server 对象的文档

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

Especially the socketOptions where you can set keepAlive and the connection timeouts. By default keepalive is off and timeout is 0 or never which means the os default socket timeout is in effect (varies from os to os). Keep alive will send a packet once in awhile down the tcp socket connection to keep it alive. Sometimes firewalls are badly configured and don't send an end packet when they close a connection leaving the connection dead and in limbo which is what the monoglabs people are talking about (more often than not to be honest they are horribly configured).

于 2013-01-15T23:03:56.540 回答
1
  1. 检查您的计算机不会进入睡眠状态
  2. 检查您的路由器/防火墙是否没有杀死空闲连接

第一个问题原来是我的电脑在不知不觉中休眠并断开网络连接。这是一台新电脑,我没有意识到我没有禁用睡眠 :-P

MongoLab 的 Jared 帮助我解决了这个问题,我对此表示感谢。他说这种行为在通过防火墙时很常见(正如 mjhm 在他的评论中所建议的那样)。因此,一项测试是绕过它。

仍然通过我的路由器,空闲几个小时后我得到一个不同的错误:

db.users.find()
Sun Jan 13 14:55:02 Socket say send() errno:32 Broken pipe 107.22.25.25:47207
Error: 9001 socket exception [2] server [107.22.25.25:47207] 
Sun Jan 13 14:55:02 trying reconnect to ds047207.mongolab.com:47207
Sun Jan 13 14:55:02 reconnect ds047207.mongolab.com:47207 ok

我会从不通过我的路由器/防火墙的服务器再试一次。

驱动程序在当前操作上引发异常的行为是预期的并且可以接受,因为断开连接确实是一个例外情况。

更新:当我绕过我的路由器时,这些问题都不会发生,它们也不会发生在我的 Nodejitsu 实例中,我相信它在 Joyent 数据中心中运行。

于 2013-01-13T19:04:41.287 回答
0

I had the same problem and I think it's because I'm accessing the internet behind a proxy server

于 2014-01-21T06:42:26.157 回答