2015-02-11 63 views
0

我有一個使用postgres亞馬遜RDS的亞馬遜beanstalk節點應用程序。要使用postgres連接節點,我使用node postgres。代碼如下所示:節點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中,我調用'this/self.done()'來釋放連接回池。現在當我反覆提出這些請求時,client.query永遠不會回來。在什麼情況下會導致阻塞/不響應數據庫接口?

回答

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. Release client執行所有查詢後。這是一個棘手的方式,因爲調用是異步進行的,所以您需要注意client不共享,即在client.query回調函數完成之前不會發出新的請求。
+0

非常好。從文檔中我不清楚每次需要查詢數據庫時需要打開一個連接。我認爲客戶端對象是池。 – 2015-02-11 15:02:21