2015-02-11 2 views
0

У меня есть приложение узла beanstalk amazon, которое использует postgres amazon RDS. Для интерфейса узла с 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()», чтобы освободить соединение обратно в пул. Теперь, когда я повторяю эти запросы, клиентский запрос никогда не возвращается. При каких обстоятельствах это может привести к блокированию/не реагированию на интерфейс базы данных?

ответ

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.
+0

Отлично. Мне было не ясно, из документов, что мне нужно открыть соединение каждый раз, когда мне нужно запросить БД. Я думал, что объект-клиент - это пул. –

Смежные вопросы