如何在服务器中使用node-postgres?

时间:2013-03-25 16:06:12

标签: node.js node-postgres

我正在编写一个使用Postgres数据库的Node.js Web服务器。我过去常常连接每个新请求:

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. 让网络发生故障后全局客户端自动重新连接。

1 个答案:

答案 0 :(得分:16)

我假设您正在使用最新版本的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 wiki