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"

------------------

Мои опасения:

  1. Я использую бассейн?

  2. Как правильно использовать пул?

  3. Нужно ли мне подключаться к pg, что означает conn.connect каждый раз, когда я выполняю какой-либо запрос в коде?

  4. Как мне справиться, если база данных недоступна, код просто зависает при чтении, а затем истекает по истечении очень долгого времени? Можно ли как-нибудь перевести тайм-аут после желаемого времени?

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);
}
Другие вопросы по тегам