我是node.js的pg-postgres的新手。我试图找出正确的查询方式。现在我有这个
var client = new pg.Client(connectionString);
client.connect();
然后在我的每个http请求路由中,我都有这种代码:
var query = client.query(sql);
query.on('row', function(row, result) {
result.addRow(row);
});
query.on('end', function(data) {
if (data.rows[0].count === '1') {
return callback();
}
return failedCallback(req, res);
});
这是这样做的吗?或者我应该在每个http路由处理程序
中执行此操作pg.connect(conString, function(err, client) {
// Use the client to do things here
client.end();
});
我还需要以这种方式结束每个http路由处理程序中的客户端吗?
答案 0 :(得分:0)
这是一个选择问题。第一个允许您在其他函数中重用已声明的客户端,而第二个客户端在您的pg.connect
内。我不认为你可以说一个是正确的而另一个不是。我可以将问题改为"更好的是:c.query(sql, function (err, result) {
或query.on('end', function(data) {
"。
client.end()
:如果您在每个http路由处理程序中结束连接,则除非再次client.connect();
,否则您将无法重用客户端。这并不意味着你根本不必关闭它。我认为将客户端终止绑定到response.send()
是合理的。如果你没有关闭与postgres的联系,你将很快到达max_connections
。再次 - 您可能会使用连接池而不是直接连接到pg,但这并不意味着您应该无休止地生成新的和新的连接。
//https://github.com/brianc/node-postgres
var pg = require('pg');
var conString = 'postgres://n@10.1.10.199/b';
var sql = 'SELECT substr(extract(epoch from now())::text,10,4) sec, $1::int client,pg_backend_pid() pid,count(*) from pg_stat_activity where usename = current_user group by client';
var client = new pg.Client(conString);
client.connect();
var query = client.query(sql,[1]);
query.on('end', function(data) {
console.log(data.rows);
});
var query = client.query(sql,[1]);
query.on('end', function(data) {
console.log(data.rows);
//client.end();
});
var to = setTimeout( //we start new client with small timeout to see one session with previous client
function() {
pg.connect(conString, function(err, c) {
// execute a query on our database
c.query('select pg_sleep(0.6);', function (err, result) {
});
c.query(sql,[2], function (err, result) {
if (err) throw err;
console.log(result.rows);
});
c.query(sql,[4], function (err, result) {
console.log(result.rows);
});
//c.end();
to;
});
}
, 500
);
var to = setTimeout(
function() {
var query = client.query(sql,[3]);
query.on('end', function(data) {
console.log(data.rows);
//client.end();
});
}
, 1000
);
生成:
...js>node 1.js [ { sec: '2.31', client: 1, pid: 23327, count: '1' } ] [ { sec: '2.32', client: 1, pid: 23327, count: '1' } ] [ { sec: '3.29', client: 3, pid: 23327, count: '2' } ] [ { sec: '3.41', client: 2, pid: 23328, count: '2' } ] [ { sec: '3.42', client: 4, pid: 23328, count: '2' } ]
如您所见,客户端1和客户端3共享相同的pid,尽管在不同的函数中调用,因为声明了全局var client
。对于2和4相同,在一个pg.connect
中称为async共享一个pid。
现在,您应该将代码放入c.query(sql, function (err, result) {
或query.on('end', function(data) {
,具体取决于您希望实现的目标。