数据库连接池处理节点js应用程序的最佳做法?

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

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

我猜这个例子可以正常工作,但是一旦你的应用程序变得稍微大一些,这个问题就会很快出现。

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

  1. 在任何需要与db进行交谈的地方执行“获取客户端+工作+发布客户端”的方法。

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

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

    这是一个好主意,实际上可行吗? 是否可以很好地处理在所有丑陋的情况下“回到池释放”(例如并行asynchronous的东西的错误)?

谢谢。

那么,我花了一些时间试图弄清楚。 最后,经过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); } }); } } } 

所以,当我需要执行查询时:

 getDb().then(function(db) { //performe query here }); 

至less对Mongodb来说,这是一个很好的做法。

最好的build议将取决于数据库的types和代表数据库的基本框架。

在Postgres的情况下,基本框架/驱动程序是node-postgres ,它embedded了对连接池的支持。 然而,这种支持是低层次的。

对于高级访问,请参阅pg-promise ,它提供了自动连接pipe理,对任务 , 事务等的支持。

这是什么对我有好处。

 var pg = require('pg'); var config = { pg : 'postgres://localhost/postgres' }; pg.connect(config.pg, function(err, client, done) { client.query('SELECT version();', function (err, results) { done(); //do something with results.rows }); });