mongodb的open和close疑问
发布于 11 年前 作者 guang152252326 14675 次浏览 最后一次编辑是 8 年前

在操作mongodb的时候经常遇到

Error: db object already connecting, open cannot be called multiple times

这种问题。 个人找到了原因,是因为上一次 mongodb.open(), 还没有来得及 mongodb.close() 就开始了下一次 mongodb.open()

我的疑问是这样的问题一般怎么处理,看到有人说打开一次就不关闭了,一直保持开始状态, 有人又说一直打开不好。

求教~

11 回复

先打开数据库,取得要获取的数据,然后再关闭数据库,我觉得这种用法应该比较多一些

我开始时这样用的,但是例如我两个ajax请求同事需要访问数据库,会导致一个数据库打开了还没有关闭,另外一个mongodb.open()出错

@guang152252326 你这么一说我也有点迷糊了 但是第二次访问,不是要重新建一个数据库连接吗?两个应该不是共用一个数据库连接

话说,node 是单线程的…你打开了…如果要一直跑的…也没必要关闭啊…

除非你是不需要一直运行的.才需要关闭 -打开

记住node 是单线程的…以前你用别的语言,说打开了,不关闭会导致内存泄露…但是,在node不存在这种情况…

@xiao2013 重新连接时mongodb.open(),如果上一个连接没有关闭就会报错~报 Error: db object already connecting, open cannot be called multiple times

哦,谢谢啦~~我后来就是改为一直打开不关闭了,这样就没有出现问题啦,之前就是担心如果老打开会不会导致问题~习惯性的每次用完就关闭~

打开就不要关了 因为有pool机制 底层会自己帮你处理

mongoDB连接本质就是TCP连接,只要创建新的TCP去连接mongo就可以了,不过需要记住关闭不用的连接。

这个我也遇到过,后来简单的看了一下mongodb的node驱动,发现一种简单的解决办法:

var mongodb = require('./db');

if(!mongodb.openCalled)
    mongodb.open(function(err, db){...});
else
    mongodb.collection('xxx', function(err, collection){...});

这里有一个openCalled属性,可以用它来检测数据库是否已經被打开。 如果已经打开,则直接使用,否则再open

一种方法是直接从头open到尾。我也不推荐。

另一种就是用mongoose

进程启动,connect 以后,不要关闭,直接用就可以了。不要每个请求都 connect(), close()

回到顶部