I’m using nodejs and a mongoDB – and I’m having some connection issues.
Well, actually “wake” issues! It connects perfectly well – is super fast and I’m generally happy with the results.
My problem: If i don’t use the connection for a while (i say while, because the timeframe varies 5+ mins) it seems to stall. I don’t get disconnection events fired – it just hangs.
Eventually i get a response like Error: failed to connect to [ * .mongolab.com: * ] – ( * = masked values)
A quick restart of the app, and the connection’s great again. Sometimes, if i don’t restart the app, i can refresh and it reconnects happily.
This is why i think it is “wake” issues.
Rough outline of code:
I’ve not included the code – I don’t think it’s needed. It works (apart from the connection dropout)
Things to note: There is just the one “connect” – i never close it. I never reopen.
I’m using mongoose, 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);
});
I have tried various configs here, like opening and closing all the time – I believe though, the general consensus is to do as i am with one open wrapping the lot. ??
I have tried a connection tester, that keeps checking the status of the connection… even though this appears to say everthing’s ok – the issue still happens.
I have had this issue from day one. I have always hosted the MongoDB with MongoLab.
The problem appears to be worse on localhost. But i still have the issue on Azure and now nodejit.su.
As it happens everywhere – it must be me, MongoDB, or mongolab.
Incidentally i have had a similar experience with the php driver too. (to confirm this is on nodejs though)
It would be great for some help – even if someone just says “this is normal”
thanks in advance
Rob
Thanks for all the help guys – I have managed to solve this issue on both localhost and deployed to a live server.
Here is my now working connect code:
I think the biggest change was to use “createConnection” over “connect” – I had used this before, but maybe the options help now. This article helped a lot http://journal.michaelahlers.org/2012/12/building-with-nodejs-persistence.html
If I’m honest I’m not overly sure on why I have added those options – as mentioned by @jareed, i also found some people having success with “MaxConnectionIdleTime” – but as far as i can see the javascript driver doesn’t have this option: this was my attempt at trying to replicate the behavior.
So far so good – hope this helps someone.
UPDATE: 18 April 2013 note, this is a second app with a different setup
Now I thought i had this solved but the problem rose it’s ugly head again on another app recently – with the same connection code. Confused!!!
However the set up was slightly different…
This new app was running on a windows box using IISNode. I didn’t see this as significant initially.
I read there were possibly some issues with mongo on Azure (@jareed), so I moved the DB to AWS – still the problem persisted.
So i started playing about with that options object again, reading up quite a lot on it. Came to this conclusion:
That was a bit more educated that my original options object i state.
However – it’s still no good.
Now, for some reason i had to get off that windows box (something to do with a module not compiling on it) – it was easier to move than spend another week trying to get it to work.
So i moved my app to nodejitsu. Low and behold my connection stayed alive! Woo!
So…. what does this mean… I have no idea! What i do know is is those options seem to work on Nodejitsu…. for me.
I believe IISNode uses some kind of “forever” script for keeping the app alive. Now to be fair the app doesn’t crash for this to kick in, but i think there must be some kind of “app cycle” that is refreshed constantly – this is how it can do continuous deployment (ftp code up, no need to restart app) – maybe this is a factor; but i’m just guessing now.
Of course all this means now, is this isn’t solved. It’s still not solved. It’s just solved for me in my setup.