节点js app中数据库连接池处理的最佳实践?

M.M*_*.M. 6 postgresql asynchronous node.js

我指的是下面的node-postgres包,但我想这个问题相当通用.

有一个简单的例子,你1)从顶级http请求处理程序中的池中获取(连接)连接(客户端),2)执行该处理程序内的所有业务,3)在你'之后将它释放回池中重做.

我想它适用于那个例子,但是一旦你的应用程序变得更大,这很快就会变得痛苦.

我正在考虑这两个选项,但我不太确定......

  1. 在我需要与db交谈的地方做"获取客户端+工作+发布客户端"的方法.

    这似乎是一个不错的选择,但它不会导致每个顶级http请求占用多个连接/客户端(在我的项目的许多地方都有并行异步数据库调用)?

  2. 尝试将globaly共享引用分配给可通过的一个客户端/连接require()

    这是一个好主意,实际上是否合理可行?是否有可能在所有丑陋的情况下很好地处理"回到池发布"(例如,并行异步内容中的错误)?

谢谢.

Raf*_*nda 1

好吧,我花了一些时间试图弄清楚这一点。最后,经过一番考虑并受到John Papa 代码的影响,我决定使用database这样的模块:

var Q = require('q');
var MongoClient = require('mongodb').MongoClient;

module.exports.getDb = getDb;

var db = null;

function getDb() {
  return Q.promise(theDb);

  function theDb(resolve, reject, notify) {
    if (db) {
      resolve(db);
    } else {
      MongoClient.connect(mongourl, mongoOptions, function(err, theDb) {            
          resolve(db);
        }
      });
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我需要执行查询时:

getDb().then(function(db) {

    //performe query here

});
Run Code Online (Sandbox Code Playgroud)

至少对于 Mongodb 来说这是一个很好的实践,如下所示