CNode

mongodb连接数

Ssunuxreg发布于13 年前最后回复13 年前17 回复9359 浏览0 收藏

我写了一个网页,很简单。两张静态图片和一段存储在Mongodb中的文字。但是在不断刷新网页时会出现下面的错误: Error: db object already connecting, open cannot be called multiple times at Db.open (X:\BYSJ\Project\simulat\node_modules\mongodb\lib\mongodb\db.js:224:11) at exports.index (X:\BYSJ\Project\simulat\routes\index.js:16:12) at callbacks (X:\BYSJ\Project\simulat\node_modules\express\lib\router\index.js:161:37) at param (X:\BYSJ\Project\simulat\node_modules\express\lib\router\index.js:135:11) at pass (X:\BYSJ\Project\simulat\node_modules\express\lib\router\index.js:142:5) at Router._dispatch (X:\BYSJ\Project\simulat\node_modules\express\lib\router\index.js:170:5) at Object.router (X:\BYSJ\Project\simulat\node_modules\express\lib\router\index.js:33:10) at next (X:\BYSJ\Project\simulat\node_modules\express\node_modules\connect\lib\proto.js:190:15) at Object.methodOverride [as handle] (X:\BYSJ\Project\simulat\node_modules\express\node_modules\connect\lib\middleware\methodOverride.js:37:5) at next (X:\BYSJ\Project\simulat\node_modules\express\node_modules\connect\lib\proto.js:190:15)

我的代码如下: exports.index = function(req, res){ // var dbtest=require('dbcon'); var mongodb=require('mongodb') , mongoserver=new mongodb.Server('localhost',27017) ,dbtest=new mongodb.Db('test',mongoserver,{w:-1});

// console.log(dbtest.serverConfig);
 var pas;
dbtest.open(function(err,db){
    if(err){
       // console.log(db)
        console.log("OPen Db Failed");
        //db.close();
        return res.redirect("/error");
    } else{
      db.collection('test',function(err,coll){
          if(err){
              console.log("Slect Collection  Failed");
              db.close();
              return res.redirect("/error");
          }
        coll.find({title:"test"}).toArray(function(err,doc){
            if(err){
                console.log("query data Failed");
                db.close();
                return   res.redirect("/error")   ;
            }
            pas=doc[0].con;
            //console.log(doc);
            res.locals.pas=pas;
            db.close();
           res.render('index', { title: 'Express' });
        })
      });
    }

});

};

请问问题出在哪啊?

查看回复

回复 (17)

S
sunuxreg#1·13 年前
引用 leapon打开一次,多次使用 不是打开多次。

我已开始也这么想过,但是我发现,如果不通过open函数打开数据库,无法获得db对象啊,因为err和db对象是作为参数传给回调函数的啊?

D
dingwei#2·13 年前

我看好象mongodb连接有超时的, 过一段时间mongodb会自动关闭的吧

Y
youxiachai#4·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@sunuxreg node 是单线程的啊。。。。

S
sunuxreg#5·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@youxiachai 那对来自于不同用户的请求不也应该开辟一个独立的空间吗?

Y
youxiachai#6·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@sunuxreg 你这个是php,java的做法。。。对于请求新开一个线程。。但是,node 是把请求作为事件丢到底层处理。

S
sunuxreg#7·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@youxiachai 关键是当一个用户在访问页面时,如果我不open的话,就得不到db对象,进而也不能对数据库进行操作了

Y
youxiachai#8·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@sunuxreg 我记得有个方法,是用来判断有没有打开的。。。打开了就不用管,关闭了就重新打开。。

Y
youxiachai#9·13 年前

http://cnodejs.org/topic/51904ff263e9f8a5429fde30

你这个问题貌似论坛里面很早就有几个相关的,我暂时找到一个。

Y
youxiachai#10·13 年前

跟你问题比较相近的,应该是并发导致的

http://cnodejs.org/topic/51aacd56555d34c6785805eb

D
dingwei#11·13 年前
引用 dingwei我看好象mongodb连接有超时的, 过一段时间mongodb会自动关闭的吧

@sunuxreg 是的, 连接池里的连接有超时设置的好象

L
leapon#12·13 年前

没有必要关闭 db,db 打开后保留给下次用。

db.close()
S
sunuxreg#13·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

不关闭的话,持续打开不会造成系统资源耗尽吗?

L
leapon#14·13 年前

打开一次,多次使用

不是打开多次。

S
sunuxreg#15·13 年前
引用 leapon没有必要关闭 db,db 打开后保留给下次用。 db.close()

@youxiachai 在数据库打开的情况下怎么获得db对象呢?

S
sunuxreg#16·13 年前
引用 youxiachai跟你问题比较相近的,应该是并发导致的 http://cnodejs.org/topic/51aacd56555d34c6785805eb

呵呵,谢谢,这个帖子也是我提问的,就是最近做毕业设计遇到各种问题。帖子里边推荐用mongoose和mongoskin,但是我也不知道时候能解决并发的问题。

S
sunuxreg#17·13 年前
引用 dingwei我看好象mongodb连接有超时的, 过一段时间mongodb会自动关闭的吧

@dingwei 我发现了一个问题,但是不知道怎么解释。就是如果将poolSize配置为大于1的数字,那么在进行那个并发测试时,就会有一半的open操作失败。但是如果把poolSize配置为1,就不会出现can't connect to database的错误。而且poolSize即使设置为100也会有一半的链接出错。

参与回复
登录后即可参与回复。登录