数据库连接池处理节点js应用程序的最佳做法?
我指的是下面的node-postgres包,但我想这个问题是相当通用的。
有这样一个简单的例子 ,你1)从顶级http请求处理程序池中获取(连接)一个连接(客户端),2)做该处理程序内的所有业务,3)释放它回到池之后,重做。
我猜这个例子可以正常工作,但是一旦你的应用程序变得稍微大一些,这个问题就会很快出现。
我正在考虑这两个选项,但我不太确定…
-
在任何需要与db进行交谈的地方执行“获取客户端+工作+发布客户端”的方法。
这似乎是一个不错的select,但是不会导致每个顶级http请求吃掉多个连接/客户端(在我的项目的许多地方有并行的asynchronous数据库调用)?
-
尝试将一个全局共享引用分配给一个客户端/可通过
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 }); });
- 在瀑布内节点asynchronous并行
- 节点/量angular器等待承诺解决之前继续
- 在使用process.exit() – 节点js时,Winston日志文件并不总是保存
- 为什么node.jsasynchronous模块在使用async.eachLimit(array,limit,function,callback)的第一步之后停止?
- 节点asynchronous推送循环
- 可以有很多function(超过10)来处理Node的asynchronous性质(特别是在添加到MySql数据库时)
- pipe理asynchronous性并在节点中执行多个MySQL查询
- 节点并发/快速请求生命周期/可能的竞争状态?
- nodejs强制同步调用来存储json