簡體   English   中英

使用異步隊列控制數據庫連接請求

[英]Using Async queue to control DB connection request

我正在使用Node anb Mongodb Native來構建應用程序。 我正在開發一個數據庫模塊,我可以要求它並調用其他模塊,以便最終只使用一個連接。 db.js模塊以以下代碼開始:

var _db = null;
var getDb = module.exports.getDb = function(callback) {
  if (_db) {
    console.log('_db returned');
    return callback(null, _db);
  }
  MongoClient.connect('mongodb://localhost:' + config.db.port + '/' + config.db.name, {native_parser: true}, function (err, db) {
    if (err) return callback(err);
    console.log('_db created');

    _db = db;
    callback(err, _db);
    });
};

在需要數據庫連接的其他模塊中,我這樣做

db.getDb(function (err, connection) {
  // Do something with connection
});

工作正常。 但是一個不愉快的問題是,如果我的代碼在很短的時間內多次調用getDb ,我最終將獲得一個連接的多個副本。 就像我在需要數據庫連接的所有模塊的開始處執行db.js要求和getDb調用一樣

我現在正在考慮通過排隊控制對getDb的調用,以便只有絕對的第一個調用才能創建連接並將其保存在_db 所有以后的調用都將返回創建的連接_db 我相信異步隊列將幫助我解決這個問題。

問題是我不理解我如何用異步隊列來編寫它。 文檔有點含糊,我在網上找不到更好的例子。 也許您可以給我一些提示。 這就是我到目前為止所得到的...

var dbCalls = async.queue(function (task, callback) {
  if (_db) {
    console.log('_db returned');
    return callback(null, _db);
  }
  MongoClient.connect('mongodb://localhost:' + config.db.port + '/' + config.db.name, {native_parser: true}, function (err, db) {
    if (err) return callback(err);
    console.log('Connected to mongodb://localhost:' + config.db.port + '/' + config.db.name);

    _db = db;
    callback(null, _db);
  });
}, 1);

// I guess this .push() must be the exposed (exported) API for other modules to get a connection, but how do I return it to them,  
dbCalls.push(null, function (err) {
  console.log('finished processing foo');
});

dbCalls.push(null, function (err) {
  console.log('finished processing bar');
});

我不理解將對象作為第一個參數傳遞給.push()怎么辦? 現在,它為null如何將連接和可能的錯誤一直傳遞到進行調用的模塊?

沒有async.queue快速而骯臟的解決方案:

var _db      = null;
var _err     = null;
var _queue   = [];
var _pending = false;

var getDb = module.exports.getDb = function(callback) {
  if (_err || _db) {
    console.log('_db returned');
    return callback(_err, _db);
  } else if (_pending) { // already a connect() request pending
    _queue.push(callback);
  } else {
    _pending = true;
    _queue.push(callback);
    MongoClient.connect(..., function (err, db) {
      _err = err;
      _db = db;
      _queue.forEach(function(queuedCallback) {
        queuedCallback(err, db);
      });
    });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM