【问题标题】:How to deal with connections and query queues in node.js node-mongodb?如何处理node.js node-mongodb中的连接和查询队列?
【发布时间】:2012-09-13 21:26:28
【问题描述】:

我不清楚如何使用该连接和查询集合。 因为有时连接已经存在并且没有问题。但是当需要建立连接时,集合查询不会排队。 你也不能一直建立新的联系,因为你可以(而且应该)只建立一个。 似乎您需要在连接回调中使用集合查询,但在连接已经存在时也需要独立。

当然,这是不可撤消的,但是由于开销很大,我想我做得不对。 毕竟,这对我来说似乎有点句法糖精syntactic sugar 在哪里?

这是一个基本的例子。想象一下在同一秒内有一堆请求:

var util        = require('util'),
    mongo       = require('mongodb'),
    Server      = mongo.Server,
    Db          = mongo.Db,
    mServer     = new Server('localhost', 27017),
    mDb         = new Db('SomeDatabase', mServer),
    db;

if (mDb._state == 'disconnected') {
    util.debug('MONGODB: connecting...');
    mDb.open(function(err, newDb) {
        if (!err) {
            db = newDb;
            // I cannot immediately work on a collection here, 
            // because it takes a moment for the db to connect.
        }
    });
}
else if (mDb._state == 'connecting') {
    // I need to catch this state because I cannot work on collections yet, 
    // but I cannot connect either because it's already connecting.
}
// else if (mDb._state == 'connected') {

// Queries need to be performed after connection is established 
// or when connection was already established by a previous request.
db.createCollection(collection, function(err, collection) {
    if (!err) {
        collection.insert(record, {safe:true}, function(err, result) {
            util.debug('MONGODB: Inserted.');
        });
    }
});

// }

现在,我找到的初学者指南都是关于 mDb.open 上的回调,但是当节点已经运行时,这会给后续请求带来问题。它拒绝打开另一个连接。 那么,当单个启动回调还不够时,真正在 nodejs 中使用 mongodb 的正确方法是什么

我想象一个你以回调形式传递查询的模块,它为你传递回调,或者(1)到它等待连接回调的地方,(2)直接到集合,或者(3)等待连接,但连接回调为时已晚。但就像我说的,这是纯粹的句法糖精。

【问题讨论】:

  • 听起来你想要一个 Deferred 对象用于你的数据库连接...

标签: javascript node.js mongodb


【解决方案1】:

你误会了什么。首先创建与 DB 的连接:

var mDb = new Db('SomeDatabase', mServer);

并且您持有对此连接的引用。每当您想从/向 DB 加载/保存某些内容时,您都可以使用 same 变量。您不会在每次请求时都重新创建它。甚至在创建 Web 服务器本身之前就应该进行初始化(在 open 回调上创建服务器)。这是一个伪代码:

var webserver = INITIALIZE_NEW_SERVER( );
var mDB = new Db('SomeDatabase', mServer);

// set request handler
WHEN_REQUEST ---> {
    mDB.createCollection( ... );
    // whatever
}

mDb.open(function(error, newDb) {
    // handle errors
    webserver.listen( );
});

【讨论】:

  • 但是如果数据库 i/o 只在某个时间发生,人们通常使用mDB.close(),你不能让它影响你的服务器是否正在运行。
  • 另外,能否详细说明一下原始mDb和回调newDb的区别?如:为什么他们在文章中始终命名为clientpClient
  • @Redsandro mDbnewDb 都指向同一个对象。
  • @Redsandro 我不知道你在说什么文章。另外,我不确定您要做什么。你想阻止你的服务器在特定时间之外连接数据库吗?然后根据请求查看当前时间并始终保持连接打开。处理和保持与 DB 的连接更容易,几乎没有开销。而且(正如您所注意到的)它有一个很大的优势:它可以很好地扩展,而始终创建连接却不能。
  • @freakish 你可以googlemongodb "pClient" 看到pClient 广泛用于回调,而client 用于实际命令。根据 JohnnyHK 的说法,它们指的是同一个对象。但我从未见过使用过的pClient。那是为了什么?至于数据库,让数据库调用整个服务器而不是相反的方式感觉不对。如果节点重新启动,并且数据库暂时不可用,我希望服务器启动并跳过数据库内容,直到它变得可用。
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2012-10-24
  • 2023-03-11
  • 1970-01-01
  • 2014-10-05
  • 2012-07-09
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多