node.js用于创建数据库连接一次的设计模式

时间:2011-06-08 07:42:18

标签: javascript database design-patterns node.js

我正在寻找有关在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;
};

这使得获取数据库连接简单快速,但意味着我们必须在节点启动时“等待”才能建立连接。

哪个更好的设计?有没有更好的做事方式?

3 个答案:

答案 0 :(得分:8)

mydb.js模块:

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

其他模块:

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

这会在启动时创建一次DB客户端实例。我喜欢这个解决方案,因为创建代码封装在一个单独的模块中,其他模块可以通过一个require()语句访问客户端。

答案 1 :(得分:4)

我见过的最佳答案是:

在start.js中

    function init_done() {

      app.listen(8080);

    }


init_databases(init_done);

在databases.js中:

init_databases(init_done_cb) {

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

    if (err == null) init_done_cb();

  });
}

通过这种方式,您可以在没有这种尴尬/危险等待期的情况下进行数据库服务器的异步启动。

答案 2 :(得分:0)

我写connect-once只是为了解决这类问题。这个模块有两个主要目标:

  1. 应在请求到达之前初始化连接
  2. 连接应初始化一次,即使有多个请求同时进入
  3. 您可以查看express-mongo-dbexpress-mongoose-db作为使用示例。