我一直在寻找mongodb中意外关闭的连接,但只能找到想要关闭它们的人的问题。
我使用node-mongodb-native连接到数据库,但我一直看似随机“错误:连接关闭”消息。如果我手动重试请求(浏览器刷新),请求将起作用。
知道造成这种情况的原因是什么?是否有一些简单的选项可以提供帮助?
我正在使用:
获取我的数据库句柄 MongoClient.connect(connection_string, { auto_reconnect: true }, function (err, db) {
//server code/routes in here
}
我正在浏览https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/connection/server.js,但我意识到我对如何管理连接池的有限理解正在绊倒我。我的印象是他们会在我服务器的生命周期内保持开放状态。有人可以帮忙吗?
编辑: 在阅读了mjhm的评论之后,我开始更深入地研究TCP保持活力。偶然发现一些网站暗示这可能是Azure正在做的(这个问题现在被错误分类了!)。显然,Azure负载均衡器会在1分钟的活动后终止连接。我正在使用Azure网站,因此它可能适用也可能不适用,但我认为这种洞察力很有希望开始新的调查。更多细节http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx
答案 0 :(得分:5)
来自:http://christiankvalheim.com/post/32209721702/tcp-keepalive
TCP keepalive 在使用mongodb node.js驱动程序时,经常出现的一个问题是停止响应的套接字。这通常有两个来源。
应用程序和mongodb实例之间有一个防火墙,它没有观察到keepAlive。
系统上的套接字超时为高,使套接字挂起并且永不关闭。 第一种情况可以通过设置套接字连接选项并启用keepAlive并在套接字上设置硬超时值来解决。这将确保正确配置的防火墙将使连接保持活动状态,如果不存在则会超时。 调整的另一件事是os tcp_keepalive_time。对于MongoDB这样的东西来说基本上是高的(在linux上默认为2小时)。设置此值将正确超时死套接字并让驱动程序恢复。
阅读更多相关信息的好链接。 http://www.mongodb.org/display/DOCS/Troubleshooting#Troubleshooting-Socketerrorsinshardedclustersandreplicasets