问题就是,我用node-mongodb-native连接上mongodb之后,默认打开了一个有五个连接的连接池,但是这5个连接在几分钟后自动就关闭了 这个是mongodb的配置文件 这个是mongodb的log日志
这个是我的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");
求大神解答~~
求大神解答~~
我不是大神,想问为啥不用mongoose?
@libook 为啥一定要用mongoose?
目测逻辑没问题,怀疑是某个api做了超时断线的逻辑。正在查找。
@haozxuan 感谢
求大神解答~~
@xuguoliangjj 你的这个url拼接模型在哪里看到的? var url = ‘mongodb://’+user+’:’+password+’@’+host+’:’+port+’/’+db_name+’?authSource=’+authSource;
@haozxuan 2.0.33 官方的是这样的
// Connection URL
var url = 'mongodb://dave:password@localhost:27017/myproject';
authSource
是通过通过哪个集合来验证账号密码啊,我的账号密码是在admin
里的,所以authSource=admin
@xuguoliangjj 恩,你的这种写法是“Indirectly Against Another Database”,你可以尝试不设置身份验证测试下,看是否会自动断线。因为我调查的结果是并没有相关api会自动断开。
重点看启动mongodb的 方式
@haozxuan 我去掉了身份验证,还是一样
@wldlzt 什么启动方式?/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb.conf
我就是这么启动的,配置文件上面有图片
顶起来
顶起来
是不是keepAlive问题? socketOptions: {keepAlive: 1}
2.4版本后,不加keepAlive, 会出现意外链接断开.
@macross2005 加了keepAlive还是一样会断开,怎么回事啊
关注下这个问题~
找到问题了,如果我的脚本和MongoDB在同一台服务器上就不会有这种情况,但是如果本地的脚本去连服务器上的MongoDB就会出现上面的情况,有人知道原因吗?
估计通讯问题吧(平时真没在意过这个连接数的问题)。我推测的:如果有脚本连接连接池就会有连接数,关闭脚本运行,连接数就会下降。既然是远程通讯,那通讯中断是不是就相当于关闭脚本运行呢?如果你5分钟左右连接数降为0,那约3~4分钟重新运行一次脚本(比如刷新一下),如果连接数没降,那应该就是通讯问题了。
顶一下~~
是不是服务器把链接给干掉了,自己局域网内测试一下呢。
顶一下~~
@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});
程序不一定完全对,自己掂量用哪种吧~