2016-06-10 97 views
0

我使用MongoDB和Socket.IO创建了一些节点应用程序,当我插入一些文档时,每个操作都不起作用。我发现MongoDB在插入一些文档后不插入文档(我不知道有多少文档)。所以,我检查与MongoDB的外壳连接:查询后未释放的MongoDB连接

db.serverStatus().connections 

起始节点的应用程序之前,甾体抗炎药:

{ “电流”:1, “可用”:3275, “totalCreated”:NumberLong(639) }

插入后

一些文档:

{ “当前”:51, “可用”:3225, “totalCreated”:NumberLong (708)}

关断节点应用程式:

{ “当前”:1, “可用”:3275, “totalCreated”:NumberLong(708)}

这是服务器端的代码。 (我使用MongoDB的外部模块,所以可以从少MongoDB的原始模块node.js中不同的这个模块只是简单的包装MongoDB的基于无极API)

const app = require('http').createServer(); 
const io = require('socket.io')(app); 
const am2 = require('am2'); 
... 

am2.connect('localhost', '...', { ... }); 

const sockets = {}; 

io.on('connection', (socket) => { 

    // save the socket into sockets object 
    sockets[socket.id] = socket; 

    // release socket on disconnection 
    socket.on('disconnect',() => { 
     delete sockets[socket.id]; 
    }); 

    ... 

    // pseudo doc inserting event 
    socket.on('/insert/some/docs', (data) => { 
     am2.insert({ ... }).then(() => { 
      socket.emit('/after/insert/some/docs', {}); 
     }).catch(...); 
    }); 
}); 

当客户发出“/插入/一些/ docs'事件,服务器将文件插入到MongoDB中。前几次尝试运行良好,但在插入后,它不再工作。

我认为这是因为很多连接在插入完成后仍然存在,但我不知道为什么。如果它是像MySQL那样的RDBMS,那么在完成操作后每个连接都必须关闭,但在MongoDB中,它不应该是(据我所知)。

我不知道这是为什么发生,所以它会非常感激,帮我一把。

+0

你知道官方的MongoDB驱动[已经支持诺言](http://mongodb.github.io/node-mongodb-native/2.1/reference/ecmascript6/)?除此之外:连接只能显式关闭,因此插入文档不会关闭任何连接。这也不需要这样做,因为连接被重用。每个插入的连接数量是否增加? – robertklep

+0

那么你的am2软件包有什么问题?有它像github托管任何地方,所以我们可以看看代码? – Molda

回答

0

我通过在从MongoDB获取数据后释放游标来解决此问题。确保释放,否则它会保持连接池并使您的应用程序无法工作。