刚刚看了该论坛的该于mongodb连接池问题的帖子“mongodb驱动的正确使用方法” ,地址:http://cnodejs.org/topic/5190d61263e9f8a542acd83b 产生了疑惑!!! 当连接池poolSize设为10时,插入100万条数据,用时78472毫秒。当连接池poolSize设为1时,插入100万条数据,用时53454毫秒。 也就是说当连接数为1时,反而比连接数为10时用时更少!那要连接池还有什么用呢????
一下是测试代码,在Linux下运行 var server_options={‘auto_reconnect’:true,poolSize:1}; console.log(“poolSize:”+server_options.poolSize); var db_options={w:-1};
var mongodb = require(“mongodb”), mongoserver = new mongodb.Server(‘localhost’, 27017,server_options ), db = new mongodb.Db(‘test’, mongoserver, db_options);
db.open(function(err,db){ if(err)throw err; console.info(‘mongodb connected’); });
var time_start; function a(x){ db.collection(‘foo’).save({test:1},function(err,result){ if(x==1000000){ var now1=new Date(); var time_end=now1.getTime(); console.info(‘diff:’+(time_end-time_start)); }
});
} setTimeout(function(){ var now=new Date(); time_start=now.getTime();
for(var i=1;i<=1000000;i++) {
a(i);
} },2000)
mongodb 写的时候,同一个数据库,只能有一个进程可以使用当前入口。 你就是100个连接也没用。 因为并发已经被锁了。 这时连接数多了,反而增加CPU指令切换,他会“智能”的在几个写进程切换,让每一个都参与。
连接池的优势是读,这个不会被锁,而且即便并发写,在内存中也有记录,没有在写的数据依然可以同时读。
刚试了试,把db.collection(‘foo’).save({test:1},改成db.collection(‘foo’).find({test:1}。即写改成读操作,连续读取4千万条记录,发现连接数为10个和连接数为1个,时间上也没区别!!!甚至连接数为10个用时更长
能解释一下原因吗?读操作连接池也没有优势