Новое в Postgres и концепция пула транзакций в целом.В документации Postgres рекомендует использовать метод pool.query для отдельных запросов, а также предупреждает, что «You must always return the client to the pool if you successfully check it out
».Я понял, что это означает, что вы должны вызывать client.release () для клиентов или pool.end () для пулов (поправьте меня, если я ошибаюсь).Итак, на моем сервере Node / Express я провел простой тест:
const { Pool } = require('pg');
const pool = new Pool();
...
router.post('/test', async (req, res) => {
let { username } = req.body;
let dbRes;
try{
dbRes = await pool.query('SELECT * FROM users WHERE username = $1', [username]);
} catch(err){
let errMsg = "Error fetching user data: " + err;
console.error(errMsg);
return res.send({"actionSuccess": false, "error": errMsg});
}
//do something with dbRes, maybe do an update query;
try{
await pool.end();
} catch(err){
return "There was an error ending database pool: " + err.stack;
}
res.send({"dbRes": dbRes.rows[0]})
});
Я запускаю сервер, использую Postman, чтобы сделать почтовый вызов на этот маршрут /test
, и все работает нормально.Однако, если я сделаю тот же вызов снова, на этот раз я получу ошибку Error: Cannot use a pool after calling end on the pool
.Это имеет смысл, я завершил пул в этом запросе, но в то же время это не имеет смысла.Я предполагаю, что пулы / клиенты не привязаны к отдельным запросам к серверу, как я первоначально думал, что означает, что если один запрос к серверу Node завершает пул, он также завершает пул для всех других запросов (пожалуйста, исправьте меня, если я ошибаюсьЯ просто догадываюсь здесь).Если это так, то я никогда не смогу вызвать pool.end (), поскольку я хотел бы, чтобы пул tje был открыт / активен, пока работает сервер Node, для других запросов к серверу.Возникает вопрос: где мне закончить пул?Можно ли оставить его открытым навсегда?Это противоречит целому правилу You must always return the client to the pool if you successfully check it out
, указанному в документации?