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つを実行できますか?
- Postgres接続を適切にプールして、メモリが不足することなく毎回「再接続」できるようにします。
- ネットワーク障害が発生した後、グローバルクライアントに自動的に再接続させます。