我正在使用nodejs和mongoDB-并且遇到了一些连接问题。
好吧,实际上是“唤醒”问题!它连接得非常好-速度超快,我通常对结果感到满意。
我的问题: 如果我一段时间不使用连接(我说是因为时间间隔变化5分钟以上),它似乎停滞了。我没有触发断开连接事件-它只是挂起。
最终,我得到一个类似错误的响应:无法连接到[ .mongolab.com:]-(* =屏蔽值)
快速重启应用程序,连接再次恢复正常。有时,如果我不重新启动应用程序,我可以刷新并愉快地重新连接。
这就是为什么我认为这是“唤醒”问题。
代码粗略概述:
我没有包含代码-我认为不需要。它有效(除了连接丢失)
注意事项: 只有一个“连接”-我从不关闭它。我从不重新开放。
我正在用猫鼬,socketio。
/* constants */ var mongoConnect = 'myworkingconnectionstring-includingDBname'; /* includes */ /* settings */ /* Schema */ var db = mongoose.connect(mongoConnect); /* Socketio */ io.configure(function (){ io.set('authorization', function (handshakeData, callback) { }); }); io.sockets.on('connection', function (socket) { });//sockets io.sockets.on('disconnect', function(socket) { console.log('socket disconnection') }); /* The Routing */ app.post('/login', function(req, res){ }); app.get('/invited', function(req, res){ }); app.get('/', function(req, res){ }); app.get('/logout', function(req, res){ }); app.get('/error', function(req, res){ }); server.listen(port); console.log('Listening on port '+port); db.connection.on('error', function(err) { console.log("DB connection Error: "+err); }); db.connection.on('open', function() { console.log("DB connected"); }); db.connection.on('close', function(str) { console.log("DB disconnected: "+str); });
我在这里尝试了各种配置,例如一直打开和关闭-我相信,尽管如此,总的共识是像我一样进行一次开放包装。??
我已经尝试了连接测试器,该测试器会不断检查连接状态…即使这似乎表示一切正常,问题仍然会发生。
从第一天开始我就有这个问题。我一直将MongoDB与MongoLab托管在一起。在本地主机上,问题似乎更严重。但是我仍然在Azure和现在的nodejit.su上遇到问题。
随处可见-它一定是我,MongoDB或mongolab。
顺便说一句,我也有与PHP驱动程序类似的经验。(确认这是在nodejs上)
寻求帮助非常有用-即使有人只是说“这很正常”
提前致谢
抢
感谢所有帮助人员-我已经设法在localhost上解决了此问题,并将其部署到了实时服务器上。
这是我现在正在工作的连接代码:
var MONGO = { username: "username", password: "pa55W0rd!", server: '******.mongolab.com', port: '*****', db: 'dbname', connectionString: function(){ return 'mongodb://'+this.username+':'+this.password+'@'+this.server+':'+this.port+'/'+this.db; }, options: { server:{ auto_reconnect: true, socketOptions:{ connectTimeoutMS:3600000, keepAlive:3600000, socketTimeoutMS:3600000 } } } }; var db = mongoose.createConnection(MONGO.connectionString(), MONGO.options); db.on('error', function(err) { console.log("DB connection Error: "+err); }); db.on('open', function() { console.log("DB connected"); }); db.on('close', function(str) { console.log("DB disconnected: "+str); });
我认为最大的变化是在“连接”上使用了“ createConnection”-我以前曾经使用过,但是现在选项可能有所帮助。这篇文章对http://journal.michaelahlers.org/2012/12/building- with-nodejs- persistence.html很有帮助
如果说老实话,我不太确定为什么要添加这些选项(如@jareed所述),我还发现有些人在“ MaxConnectionIdleTime”方面取得了成功- 但据我所知,javascript驱动程序没有有此选项:这是我尝试复制行为的尝试。
到目前为止一切顺利-希望这对某人有帮助。
更新:2013年4月18日 注意,这是第二个具有不同设置的应用程序
现在我以为我已经解决了这个问题,但是问题又来了,最近又在 另一个应用程序上 使用相同的连接代码,这又让人头疼。困惑!!!
但是设置略有不同……
此新应用程序正在使用IISNode在Windows框上运行。 我最初并不认为这很重要。
我读到Azure上mongo可能存在一些问题(@jareed),因此我将数据库移至AWS-问题仍然存在。
因此,我再次开始使用该选项对象,对其进行了很多阅读。得出以下结论:
options: { server:{ auto_reconnect: true, poolSize: 10, socketOptions:{ keepAlive: 1 } }, db: { numberOfRetries: 10, retryMiliSeconds: 1000 } }
与我声明的原始选项对象相比,这有点受过教育。但是-仍然不好。
现在,由于某种原因,我不得不离开该Windows框(与未在其上编译模块有关)–移动起来要比花上一个星期才能使其正常工作要容易得多。
所以我将我的应用程序移至nodejitsu。 低,请看我的联系还活着! !
所以…。这是什么意思……我不知道!我所知道的是那些选项似乎可以在Nodejitsu上运行……。为了我。
我相信IISNode使用某种“永远”脚本来保持应用程序的生命。为了公平起见,应用程序不会因此崩溃而崩溃,但是我认为必须不断刷新某种“应用程序周期”-这就是它可以进行连续部署的方式(ftp代码,不需要重新启动应用程序)-也许这是一个因素;但我现在只是猜测。
当然,这一切都意味着现在还没有解决。它仍然没有解决。在我的设置中为我解决了。