Node Postgres模块没有响应

时间:2015-02-11 12:31:05

标签: node.js postgresql elastic-beanstalk amazon-rds

我有一个使用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永远不会回来。在什么情况下会导致阻塞/不响应数据库接口?

1 个答案:

答案 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();
  });
};

有几种方法可以区别对待:

  1. 为每个查询请求连接。因此,您需要移动要求池运行的代码add_data
  2. 执行所有查询后发布client。这是一种棘手的方式,因为调用是异步调用的,您需要注意不要共享client,即在client.query回调函数完成之前不会发出新请求。