与MongoDB的多余连接

时间:2014-02-19 17:51:09

标签: node.js mongodb mongoose

我遇到与MongoDB的多个连接有问题。

我正在使用Node.js和Mongoose连接到MongoDB。

我的简单网页只是连接,执行少量查询然后关闭连接。

但是当我重定向到另一个页面时,连接会打开两次。

如果我重新加载/重定向页面,则打开另一个连接。

我通过

连接到数据库
mongoose.connection.on('connected', function () {
    console.log('Connected to mongo server.');

});
mongoose.connection.on('error', function (err) {
    console.log('Could not connect to mongo server!');
});


mongoose.connect(mongoUrl);

并与

断开连接
 mongoose.connection.close(function(){
        console.log('connection closed');
    });

日志显示,该连接已关闭。但如果我刷新页面4x,我会在日志中看到

Connected to mongo server.
Connected to mongo server.
Connected to mongo server.
Connected to mongo server.

我错过了什么?

在MongoDB日志中是这样的(我确定连接函数只被调用一次)

Wed Feb 19 18:56:54.780 [initandlisten] connection accepted from 127.0.0.1:59777 #261 (1 connection now open)
Wed Feb 19 18:56:54.783 [initandlisten] connection accepted from 127.0.0.1:59778 #262 (2 connections now open)
Wed Feb 19 18:56:54.784 [initandlisten] connection accepted from 127.0.0.1:59779 #263 (3 connections now open)
Wed Feb 19 18:56:54.787 [initandlisten] connection accepted from 127.0.0.1:59780 #264 (4 connections now open)
Wed Feb 19 18:56:54.788 [initandlisten] connection accepted from 127.0.0.1:59781 #265 (5 connections now open)
Wed Feb 19 18:56:54.839 [conn261] end connection 127.0.0.1:59777 (4 connections now open)
Wed Feb 19 18:56:54.839 [conn262] end connection 127.0.0.1:59778 (3 connections now open)
Wed Feb 19 18:56:54.840 [conn263] end connection 127.0.0.1:59779 (2 connections now open)
Wed Feb 19 18:56:54.840 [conn264] end connection 127.0.0.1:59780 (2 connections now open)
Wed Feb 19 18:56:54.840 [conn265] end connection 127.0.0.1:59781 (1 connection now open)

整个代码在github上:https://github.com/kraag22/graphs/blob/master/app/mongo.js

2 个答案:

答案 0 :(得分:2)

我在github上简要查看了你的代码

  

我确定连接函数只被调用一次

是的,每次请求一次。在您的代码中,您有意为每个请求创建一个连接,因此我不明白为什么您对

这一事实感到惊讶
  

但是当我重定向到另一个页面时,连接会打开两次。如果我重新加载/重定向页面,则打开另一个连接。

多个请求会创建多个连接吗?也许你真正的问题是“为什么我在日志中看不到这样的东西?”

Connected to mongo server.
Connection closed.
Connected to mongo server.
Connection closed.
Connected to mongo server.
Connection closed.
...

拳头答案(治愈症状而不是疾病):mongoose.connect创建一个单独的连接,如果你真的想为每个请求创建一个连接,你必须使用mongoose.createConnectionhttp://mongoosejs.com/docs/connections.html < / p>

  

多个连接

     

到目前为止,我们已经看到了如何使用Mongoose的默认连接连接到MongoDB。有时我们可能需要为Mongo打开多个连接,每个连接具有不同的读/写设置,或者可能仅仅针对不同的数据库。在这些情况下,我们可以使用mongoose.createConnection()接受已经讨论过的所有参数,并为您返回一个全新的连接。

第二个答案(治愈疾病):我看到你使用NodeJS的方式存在概念错误。您不应该为每个请求创建一个连接,NodeJS不像PHP一样面向流程(每个请求一个进程,每个请求一个数据库连接),NodeJS可以在同一进程中处理多个并发请求,共享相同的资源,实际上是MongoDB连接

您应该在服务器启动时创建一个MongoDB连接,并让所有请求共享同一个连接。 Here一个文件中的简单示例

由于您事实上使用除AngularJS之外的MEAN堆栈(MongoDB,ExpressJS,AngularJS,NodeJS),您应该查看http://www.mean.io

答案 1 :(得分:1)

如果我没有错误,默认连接是5.您可以通过传递poolSize

来调整它

请看一看 http://mongoosejs.com/docs/connections.html