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

Posted

技术标签:

【中文标题】如何在服务器中使用 node-postgres?【英文标题】:How do I use node-postgres in a server? 【发布时间】:2013-03-15 05:00:33 【问题描述】:

我正在编写一个使用 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 服务器并重新启动它来模拟它。)

那么我该怎么做呢?

    正确池化 Postgres 连接,这样我每次都可以“重新连接”而不会耗尽内存。 让全局客户端在网络故障后自动重新连接。

【问题讨论】:

【参考方案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 wiki 上。

【讨论】:

以上是关于如何在服务器中使用 node-postgres?的主要内容,如果未能解决你的问题,请参考以下文章

在 NodeJS 中,如何使用 node-postgres 模块将 JSON 对象保存为文本?

如何使用 node-postgres 进行批量插入

如何使用 node-postgres 将多行正确插入 PG?

使用 node-postgres 在 postgres 中存储文件

如何优化 Postgresql max_connections 和 node-postgres 连接池?

将 Async/Await 与 node-postgres 一起使用