Как использовать node-postgres на сервере?

Я пишу веб-сервер Node.js, который использует базу данных Postgres. Раньше я подключался к каждому новому запросу следующим образом:

app.get('/', function (req, res) {
  pg.connect(pgconnstring, function (err, client) {
    // ...
  });
});

Но после нескольких запросов я заметил ошибки «недостаточно памяти» на Heroku при попытке подключения. В моей базе данных всего 10 строк, поэтому я не понимаю, как это могло произойти. Весь мой доступ к базе данных имеет следующую форму:

client.query('SELECT * FROM table', function (err, result) {
  if (err) {
    res.send(500, 'database error');
    return;
  }

  res.set('Content-Type', 'application/json');
  res.send(JSON.stringify({ data: result.rows.map(makeJSON) }));
});

Предполагая, что ошибка памяти возникла из-за наличия нескольких постоянных подключений к базе данных, я переключился на стиль, который я видел в нескольких node-postgres примерах подключения только один раз в верхней части файла:

var client = new pg.Client(pgconnstring);
client.connect();

app.get('/', function (req, res) {
  // ...
});

Но теперь мои запросы зависают (на неопределенный срок?), когда я пытаюсь выполнить запрос после разрыва соединения. (Я смоделировал это, отключив сервер Postgres и вернув его обратно.)

Итак, как мне сделать один из них?

  1. Правильно объединяйте соединения Postgres, чтобы я мог «повторно подключаться» каждый раз без нехватки памяти.
  2. Автоматическое повторное подключение глобального клиента после сбоя в сети.

person alltom    schedule 25.03.2013    source источник


Ответы (1)


Я предполагаю, что вы используете последнюю версию node-postgres, в которой значительно улучшен пул соединений. Теперь вы должны проверить соединение обратно в пул, иначе вы потеряете соединения:

app.get('/', function (req, res) {
  pg.connect(pgconnstring, function (err, client, done) {
    // do some stuff
    done();
  });
});

Что касается обработки ошибок в глобальном соединении (№ 2, но я бы использовал пул):

client.on('error', function(e){
  client.connect(); // would check the error, etc in a production app
});

«Недостающие» документы для всего этого находятся на вики GitHub.

person Krut    schedule 26.03.2013