簡體   English   中英

node.js 設計模式,用於創建數據庫連接一次

[英]node.js design pattern for creating db connection once

我正在尋求有關在我的 node.js 應用程序中創建數據庫連接的設計模式的幫助。

這樣做似乎很明顯:

模塊1:

var db;
exports.get_db = function(callback) {

  if (db == null) {
    dblibrary.create(connection_params, function(error, conn) {
      if (error == null) {
        db = conn;
        callback(null, db);
      }
    });
  } else {
    callback(null, db);
  }
};

模塊2:

exports.do_something = function () {
  module1.get_db(function (err, conn) {
    if (err == null) {
      // continue using query
    }
  });
};

必須懲罰每個想要使用回調要求獲得數據庫連接的人似乎很痛苦。

我可以這樣做:

模塊1:

var db;

dblibrary.create_connection(connection_params, function (err, conn) {

  if (err != null) {
     console.log("can't create connection");
     console.log(err);
     process.exit();
  } else {
     db = conn;
  }
});

exports.get_db = function() {
  return db;
};

這使得獲取數據庫連接變得簡單而快速,但這意味着我們必須在節點啟動時“等待”才能建立連接。

哪個設計更好? 有沒有更好的做事方式?

mydb.js模塊:

var db
exports.db = function() {
    if (db === null) {
        db = dblibrary.createClient()
    }
    return db
}

其他模塊:

var db = require('mydb').db()
...
db.query(...)

這會在啟動時創建一次數據庫客戶端實例。 我喜歡這個解決方案,因為創建代碼被封裝在一個單獨的模塊中,其他模塊可以通過一個 require() 語句訪問客戶端。

我見過的最佳答案是:

在 start.js 中:

    function init_done() {

      app.listen(8080);

    }


init_databases(init_done);

在 database.js 中:

init_databases(init_done_cb) {

  db.create_async(/* connect data */ , function (err, res) {

    if (err == null) init_done_cb();

  });
}

這樣您就可以在沒有尷尬/危險的等待期的情況下進行數據庫服務器的異步啟動。

我寫了一次連接只是為了解決這類問題。 該模塊實現了兩個主要目標:

  1. 連接應該在請求到達之前初始化
  2. 連接應該初始化一次,即使同時有多個請求進來

您可以查看express-mongo-dbexpress-mongoose-db作為使用示例。

暫無
暫無

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

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