CNode

使用node-mongodb-native连接mongodb,连接自动关闭的问题!

问答
Xxuguoliangjj发布于11 年前最后回复11 年前24 回复10528 浏览0 收藏

问题就是,我用node-mongodb-native连接上mongodb之后,默认打开了一个有五个连接的连接池,但是这5个连接在几分钟后自动就关闭了 这个是mongodb的配置文件 QQ图片20150617110114.png 这个是mongodb的log日志 QQ图片20150617110120.png

这个是我的base_mongodb.js文件

var MongoClient = require('mongodb').MongoClient
   , ObjectId = require('mongodb').ObjectID
   , assert = require('assert')
   , Util = require('./util')
   , db;
module.exports = function(){
   var self = this;

   this.findOneById = function(tableName,id,callback){
       connection(function (db) {
           db.collection(tableName,function(err,collection){
               var mongoId = ObjectId(id);
               var cursor = collection.find({'_id':mongoId});
               cursor.toArray(function(err,docs){
                   if(err){
                       callback(false);
                   }else{
                       callback(docs);
                   }
                   cursor.rewind();
               });
           });
       })
   };
   /**
    * 连接mongodb
    * @param callback
    */
   function connection(callback){
       if(!db){
           var dbConfig = Util.get('config.json','db');
           var host = dbConfig['host']
               , user = dbConfig['user']
               , password = dbConfig['password']
               , port = dbConfig['port']
               , db_name = dbConfig['db_name']
               , authSource = dbConfig['authSource'];
           var url = 'mongodb://'+user+':'+password+'@'+host+':'+port+'/'+db_name+'?authSource='+authSource;
           MongoClient.connect(url,function(err,dbObject){
               assert.equal(null,err);
               console.log('Connect to MongoDB success~');
               db = dbObject;
               callback(db);
           });
       }else{
           callback(db);
       }
   }
}

这个是我的http.js文件

var http=require('http')
    , BaseMongodb = require('./base_mongodb')
    , baseMongodb = new BaseMongodb();
http.createServer(function(req,res){
    res.writeHead(200,{"Content-type":"text/html;charset=utf-8"});
    switch (req.url)
    {
        case '/':
            baseMongodb.findOneById('node_booki','5574fc1055608daf0b789f38',function(ret){
                if(ret)
                    res.end(JSON.stringify(ret));
                else
                    res.end('222');
            });

            break;
    }
}).listen(3000);
console.log("浏览器打开http://127.0.0.1:3000");
查看回复

回复 (24)

X
xuguoliangjj#1·11 年前

求大神解答~~

X
xuguoliangjj#2·11 年前

求大神解答~~

L
libook#3·11 年前

我不是大神,想问为啥不用mongoose?

X
xuguoliangjj#4·11 年前
引用 libook我不是大神,想问为啥不用mongoose?

@libook 为啥一定要用mongoose?

H
haozxuan#5·11 年前

目测逻辑没问题,怀疑是某个api做了超时断线的逻辑。正在查找。

X
xuguoliangjj#7·11 年前

求大神解答~~

H
haozxuan#8·11 年前
引用 xuguoliangjj@haozxuan 感谢

@xuguoliangjj 你的这个url拼接模型在哪里看到的? var url = 'mongodb://'+user+':'+password+'@'+host+':'+port+'/'+db_name+'?authSource='+authSource;

http://mongodb.github.io/node-mongodb-native/2.0/api/MongoClient.html官方的demo中url和用户名密码是分开的,而且authSource这个目前我也没有发现。你的驱动程序版本是多少?

X
xuguoliangjj#9·11 年前
引用 haozxuan@xuguoliangjj 你的这个url拼接模型在哪里看到的? var url = 'mongodb://'+user+':'+password+'@'+host+':'+port+'/'+...

@haozxuan 2.0.33 官方的是这样的

// Connection URL
var url = 'mongodb://dave:password@localhost:27017/myproject';

authSource是通过通过哪个集合来验证账号密码啊,我的账号密码是在admin里的,所以authSource=admin

H
haozxuan#10·11 年前
引用 xuguoliangjj@haozxuan 2.0.33 官方的是这样的 authSource是通过通过哪个集合来验证账号密码啊,我的账号密码是在admin里的,所以authSource=admin

@xuguoliangjj 恩,你的这种写法是“Indirectly Against Another Database”,你可以尝试不设置身份验证测试下,看是否会自动断线。因为我调查的结果是并没有相关api会自动断开。

W
wldlzt#11·11 年前

重点看启动mongodb的 方式

X
xuguoliangjj#13·11 年前
引用 wldlzt重点看启动mongodb的 方式

@wldlzt 什么启动方式?/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb.conf我就是这么启动的,配置文件上面有图片

X
xuguoliangjj#14·11 年前

顶起来

X
xuguoliangjj#15·11 年前

顶起来

M
macross2005#16·11 年前

是不是keepAlive问题? socketOptions: {keepAlive: 1}
2.4版本后,不加keepAlive, 会出现意外链接断开.

D
DevinXian#18·11 年前

关注下这个问题~

X
xuguoliangjj#19·11 年前

找到问题了,如果我的脚本和MongoDB在同一台服务器上就不会有这种情况,但是如果本地的脚本去连服务器上的MongoDB就会出现上面的情况,有人知道原因吗?

N
nekron#20·11 年前

估计通讯问题吧(平时真没在意过这个连接数的问题)。我推测的:如果有脚本连接连接池就会有连接数,关闭脚本运行,连接数就会下降。既然是远程通讯,那通讯中断是不是就相当于关闭脚本运行呢?如果你5分钟左右连接数降为0,那约3~4分钟重新运行一次脚本(比如刷新一下),如果连接数没降,那应该就是通讯问题了。

X
xuguoliangjj#21·11 年前

顶一下~~

W
wmzy#22·11 年前

是不是服务器把链接给干掉了,自己局域网内测试一下呢。

X
xuguoliangjj#23·11 年前

顶一下~~

L
libook#24·11 年前
引用 xuguoliangjj@libook 为啥一定要用mongoose?

@xuguoliangjj mongodb原生node驱动的官方文档中说,原生驱动的功能太简单,如果你想使用MVC思想直接操作模型对象来进行数据库操作的话,推荐使用mongoose。

//使用mongoose直接新建并操作user对象
let user = new User();
user.name='jack';
user.save();
user.gender='male';
user.save();

//换成原生驱动
let user = {"name": "", "gender": "", "password": ""};
user.name='jack';
db.collection('users').insert(user);
user.gender='male';
db.collection('users').update({"$set":user});

程序不一定完全对,自己掂量用哪种吧~

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