一尘不染

mongoDB是否存在重新连接问题或我做错了吗?

node.js

我正在使用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上)

寻求帮助非常有用-即使有人只是说“这很正常”

提前致谢


阅读 251

收藏
2020-07-07

共1个答案

一尘不染

感谢所有帮助人员-我已经设法在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代码,不需要重新启动应用程序)-也许这是一个因素;但我现在只是猜测。

当然,这一切都意味着现在还没有解决。它仍然没有解决。在我的设置中为我解决了。

2020-07-07