我有一个使用postgres亚马逊RDS的amazon beanstalk节点应用程序。要使用postgres连接节点,我使用node postgres。代码如下所示:
var pg = require('pg'),
done,client;
function DataObject(config,success,error) {
var PG_CONNECT = "postgres://"+config.username+":"+config.password+"@"+
config.server+":"+config.port+"/"+config.database;
self=this;
pg.connect(PG_CONNECT, function(_error, client, done) {
if(_error){ error();}
else
{
self.client = client;
self.done = done;
success();
}
});
}
DataObject.prototype.add_data = function(data,success,error) {
self=this;
this.client.query('INSERT INTO sample (data) VALUES ($1,$2)',
[data], function(_error, result) {
self.done();
success();
});
};
要使用它,我创建我的数据对象,然后每次新数据出现时调用add_data。在add_data中,我调用了这个/ self.done()'将连接释放回池中。现在,当我反复发出这些请求时,client.query永远不会回来。在什么情况下会导致阻塞/不响应数据库接口?
答案 0 :(得分:1)
您使用池的方式不正确。
您要求函数DataObject
中的池连接。此函数充当构造函数,每data object
执行一次。因此,从池中要求只有一个连接。
当我们第一次调用add_data
时,执行查询并将连接返回到池中。因此,由于已经返回连接,因此后续调用不成功。
您可以通过记录_error
:
DataObject.prototype.add_data = function(data,success,error) {
self=this;
this.client.query('INSERT INTO sample (data) VALUES ($1,$2)',
[data], function(_error, result) {
if(_error) console.log(_error); //log the error to console
self.done();
success();
});
};
有几种方法可以区别对待:
add_data
。client
。这是一种棘手的方式,因为调用是异步调用的,您需要注意不要共享client
,即在client.query
回调函数完成之前不会发出新请求。