我对节点pg模块感到疯狂,导致“已经有太多客户端”错误。
例如,我的app.js
文件管理我查询某些数据到postgres的一些路由。 app.js
看起来像吼叫:
//First I create a client
var client = new pg.Client(connectionString);
// Then I use that client to every routes, for example:
ContPg.prototype.someController = function(req, res){
client.connect(function(error){
if(error) return console.error('error conectando', error);
// Need to close client if there's an error connecting??
client.query(someQuery, function(e,r){
client.end();
// Here sometimes I dont end client if i need to query more data
if(e) return console.error('error consultando', e);
// Do anything with result...
})
});
}
正如我所说的那样,我将该客户端用于文件pg.js
中的所有路由,但是在其他路由中使用其他路由我也会这样做以连接到postgres(创建客户端并用于管理该文件的所有路由)< / p>
问题
我的代码有问题吗?我结束了错误的客户连接? 如果没有任何问题,可能导致“已经有太多客户”的错误?
提前致谢!!
答案 0 :(得分:4)
推荐的模式是使用客户端池。来自node-postgres
documentation:
通常,您将通过池访问PostgreSQL服务器 客户端。客户需要花费很多时间来建立一个 新的联系。客户也消耗了非常重要的金额 PostgreSQL服务器上的资源 - 不是你想要做的事情 每个http请求。好消息:node-postgres附带内置的 客户共享。
var pg = require('pg');
var conString = "postgres://username:password@localhost/database";
//this initializes a connection pool
//it will keep idle connections open for a (configurable) 30 seconds
//and set a limit of 20 (also configurable)
pg.connect(conString, function(err, client, done) {
if(err) {
return console.error('error fetching client from pool', err);
}
client.query('SELECT $1::int AS number', ['1'], function(err, result) {
//call `done()` to release the client back to the pool
done();
if(err) {
return console.error('error running query', err);
}
console.log(result.rows[0].number);
//output: 1
});
});
别忘了给done()
打电话,否则你会遇到麻烦!