pg pool - как правильно использовать pg pool с функцией тайм-аута
Мне нужна помощь относительно pg npm.
Я прочитал много статей и примеров и совершенно запутался в правильном использовании пула pg. Многие статьи старые, которые я прочитал.
Я хотел бы показать вам часть моего кода и то, как я структурировал все вокруг базы данных. У меня мало вопросов, где мне нужна ваша поддержка.
Вот как я реализовал:
Я устанавливаю соединение с Postgres только один раз во время запуска сервера.
let pg = require('pg')
const db_config = {
user : DB_USER,
password : DB_PWD,
database : DB_NAME,
host : DB_HOST,
max : 5, // max number of clients in the pool
connectionTimeoutMillis : 5000,
idleTimeoutMillis : 30000
};
conn = new pg.Pool(db_config);
conn.connect((err, client, done) => {
if (err) {
log.error(err.message);
log.error(`could not connect to database`);
} else {
conn.query('SELECT 1', (err, res) => {
done();
if (err) {
log.error(err)
} else {
log.info("connected to database");
}
});
}
});
пожалуйста, обратите внимание conn
Объект является глобальным, и я использую его в своей программе далее.
Затем я запускаю свой HTTP-сервер. Каждый запрос, поступающий на сервер, должен в среднем выполнять около 25 запросов к базе данных. Я использую тот же объект conn для запуска запросов, что и ниже, при жизни программы. Каждая функция в коде включает только следующий фрагмент кода для запросов.
conn.query(query, function (err, docs) {
if (err) {
log.error(err);
} else {
// do something
}
});
Я использую "pg": "^6.2.2"
------------------
Мои опасения:
Я использую бассейн?
Как правильно использовать пул?
Нужно ли мне подключаться к pg, что означает conn.connect каждый раз, когда я выполняю какой-либо запрос в коде?
Как мне справиться, если база данных недоступна, код просто зависает при чтении, а затем истекает по истечении очень долгого времени? Можно ли как-нибудь перевести тайм-аут после желаемого времени?
1 ответ
Я знаю, что это старый вопрос и для pg 6.2.2
, но я отвечу за pg 7
+ (достаточно легко обновить), потому что я тоже столкнулся с той же проблемой и был в моем уме.
Ниже описано, как я настроил его для использования пула с использованием вашего кода. pg
достаточно умен, чтобы знать, что пул уже существует, когда conn.connect()
используется снова, немедленно или позже. Я оборачиваю логику в функцию запроса, которую я могу легко использовать повторно. Теперь он не зависает при возникновении ошибки, но вы можете получить неожиданные данные, возвращенные при возникновении ошибки, так что следите за этим.
let pg = require('pg')
const db_config = {
user : DB_USER,
password : DB_PWD,
database : DB_NAME,
host : DB_HOST,
max : 5, // max number of clients in the pool
connectionTimeoutMillis : 5000,
idleTimeoutMillis : 30000
};
const conn = new pg.Pool(db_config);
function query(sql, cb) {
conn.connect((err, client, done) => {
if (err) {
log.error(err.message);
log.error(`could not connect to database`);
cb(err);
done();
}
else {
client.query(sql, (err, res) => {
cb(res);
done();
if (err) {
log.error(err)
}
else {
log.info("connected to database");
}
});
}
});
}
Затем, чтобы выполнить запрос, просто выполните:
// run a query
query("SELECT 1", function(result) {
console.log(result);
}