11

Postgresデータベースを使用するNode.jsWebサーバーを作成しています。私は次のように新しいリクエストごとに接続していました:

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メモリエラーがデータベースへの複数の永続的な接続によるものであると想定して、ファイルの先頭で1回だけ接続するいくつかの例で見たスタイルに切り替えました。

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

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

しかし、接続が切断された後にクエリを実行しようとすると、リクエストが(無期限に?)ハングするようになりました。(Postgresサーバーを強制終了して元に戻すことでシミュレートしました。)

では、どうすればこれらの1つを実行できますか?

  1. Postgres接続を適切にプールして、メモリが不足することなく毎回「再接続」できるようにします。
  2. ネットワーク障害が発生した後、グローバルクライアントに自動的に再接続させます。
4

1 に答える 1

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
});

これらすべての「欠落している」ドキュメントは、GitHubwikiにあります。

于 2013-03-26T05:47:39.870 に答える