Я пишу веб-сервер 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 и вернув его.)
Итак, как мне сделать это?
- Правильно соединяйте соединения Postgres, чтобы я мог "повторно подключаться" каждый раз, не исчерпывая память.
- Глобальный клиент автоматически подключается после сбоя сети.