关于mongodb的异步
发布于 12 年前 作者 saber 7956 次浏览 最后一次编辑是 8 年前

资料上说数据库会为每个连接创建队列,存放这个连接的请求,当客户端发送一个请求会被放到队列的的末尾,只有队列中的的请求都执行完毕后续请求才会执行。这是不是意味这在node里面使用mongodb对于同一个db,两个find请求,第二个find请求在第一个请求的回调函数被执行前是被阻塞的

db.collection('a').find({}, function(){
  console.log('a find');
}); //这里的find需要花费10秒钟
db.collection('b').find({}, function(){
  console.log('b find');
});//这里的find只需要1秒钟

请问 ‘b find’是在什么时候被打印? 1秒钟还是11秒钟?

10 回复

先到先得 你的代码其实就是2行,对于解析器来说,都会被解析到异步队列里面。进入队列后就开始执行,谁最先执行出来就先打印谁的。

貌似没理解我的含义, mogodb并发执行这两个请求,'b find’应该在1秒钟左右被打印出来,但如果mongodb没有并发之行这个请求呢?

我感觉没必要纠结这个,如果你觉得真有必要,就自己做个测试好了

我感觉有必要,这涉及到要不要使用连接池,如果是并发的话程序里只要维护一个连接就可以了,现在主要是没有好的数据库可以测试,无法模拟出效果来

@saber 好吧,我的答案是1秒后打印b,10秒后打印a

@saber 如果要做测试的话,可以往mongodb里写类似存储过程的js原生函数,让数据库执行前徘徊一下

做了简单的测试,是按顺序的,有待进一步测试 http://inosql.org/topic/5135bcd4fd6181f36806ea4b

我也测试了,是按顺序的,所以同一个连接并不是并发请求的

@a272121742 我测试下啦的结果是10秒后打印a,11秒后打印b

本以为凭借node的异步一个程序里维护一个mongodb的连接就够了的想法是错的,还是得使用连接池

回到顶部