как отключить пул в модуле pg

Итак, я использую модуль pg в узле 8.11.1 / express 4.16.3 / pg 7.4.2

Я пытаюсь использовать пул для своего интерфейса (просто выбираю), и примеры несколько сбивают с толку.

В подключении используется только новый пул, а затем он показывает, что я должен сделать pool.end()

const pool = new Pool({
  user: 'dbuser',
  host: 'database.server.com',
  database: 'mydb',
  password: 'secretpassword',
  port: 3211,
})

pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})

Я сделал свой код таким, и он печатает Error: Cannot use a pool after calling end on the pool Если я выполняю один и тот же запрос несколько раз. Итак, нет pool.end()

В запросах в примерах нет отключения (?)

В конце концов я сделал свой код похожим на pooling. Он показывает функцию pool.on('error', (err, client) => {, а затем использует client.release() в пуле, поскольку "pool.query делегирует непосредственно client.query внутренне", я полагаю?

Итак, как правильно использовать пул в pg и как отключаться после каждого запроса или сбоя? Я придумал следующее

const pool = new pg.Pool({
  user: 'user',
  host: 'localhost',
  database: 'myProject',
  password: 'secret',
  port: 5432
});

pool.on('error', (err, client) => {
  console.error('error on client', err, 'on client' , client);
  process.exit(-1);
});

app.get('/', (req, res)=>{
  pool.connect()
    .then(client => {
      return client.query('select name from table')
           .then(resolved => {
              client.release();
              res.render('index',{'testData': resolved.rows});
            })
            .catch(e => { //return client.query
              client.release();
              res.render('index',{'errorData': e});
            })
      .catch(e => { //pool.connect()
        client.release();
        res.render('index',{'errorData': e});
      })
    })
});

Не знаю, может ли это быть короче. Например, если нужен catch(e => { ////pool.connect()... или он покрывается pool.on('error', (err, client) => {...

Кроме того, он мог бы быть намного более сортировщиком, если бы он был похож на

const pool = new pg.Pool({
  user: 'user',
  host: 'localhost',
  database: 'myProject',
  password: 'secret',
  port: 5432
});
app.get('/', (req, res)=>{
  pool.query('...')
  .then(resolved => {          
      pool.end();// pool disconnect ???
      res.render('index',{
        'testData': resolved.rows
      });
  })
  .catch(e => {
      pool.end();// pool disconnect ???
      res.render('index',{
        'testData': e
      });
  })
});

Но я не знаю, правильно ли это, потому что нет pool.connect, нет клиента, возвращенного из этого соединения, и нет функции для отключения пула (только для его завершения, который снова заканчивается с Error: Cannot use a pool after calling end on the pool).

Пожалуйста, посоветуйте правильное использование пула и синтаксис

Спасибо


person codebot    schedule 22.05.2018    source источник


Ответы (1)


Я столкнулся с подобной проблемой и с другим пакетом npm для mssql.

После некоторого следа и ошибки я решил пойти на одиночный (статический также возможен) класс, который обрабатывает соединение.

Теперь вам просто нужно вызывать одну функцию перед каждым запросом, чтобы создать новый пул соединений или получить существующий.

Что-то вроде этого:

    let _this = {};
    let connectionPool = null;

    function getConnection(){
        if(connectionPool){
            return connectionPool
        } else { 
            connectionPool = new pg.Pool({
                user: 'user',
                host: 'localhost',
                database: 'myProject',
                password: 'secret',
                port: 5432
            });
            return connectionPool;
        }
    }

   function closeConnection(){
       // close connection here       
   }

    _this.getConnection = getConnection;
    _this.closeConnection = closeConnection;

   module.exports = _this;
person BraveButter    schedule 22.05.2018
comment
Ниде подумал прямо здесь, но я подумал, что если я включу часть const pool = new pg.Pool({ user: 'user', host: 'localhost', database: 'myProject', password: 'secret', port: 5432 }); pool.on('error', (err, client) => { console.error('error on client', err, 'on client' , client); process.exit(-1); }); в файл, экспортирую ее и импортирую туда, где я выполняю запросы, то это будет иметь тот же эффект, что и синглтон. Спасибо - person codebot; 22.05.2018
comment
Насколько я знаю, вы будете создавать новый пул каждый раз, когда импортируете файл подключения. - person BraveButter; 22.05.2018
comment
Действительно? Ну, это отстой. Мы уверены, что это изменилось в новых версиях pg? Как я могу это проверить? Спасибо - person codebot; 22.05.2018
comment
Я думаю, что это не пс, это js. Вы создадите новый пул и перезапишете переменную, но не освободите соединения должным образом, это может закончиться многими открытыми соединениями с вашей базой данных, пока вы не сможете подключиться из-за них. - person BraveButter; 22.05.2018
comment
Привет снова. Мой проект основан на модуле pg, поэтому я все еще учусь и экспериментирую. Что касается синглтона, который мы обсуждали, я думаю, что это не обязательно, потому что у вас может быть файл, который создает пул один раз, а затем экспортирует различные запросы и функции (но не сам пул), как в документе здесь. Таким образом, пул создается один раз, и запрос доступен повсюду. Так что это тот же эффект, что и синглтон. - person codebot; 29.05.2018
comment
Если вы найдете другое хорошее решение для вас, не стесняйтесь добавлять и ответ - person BraveButter; 29.05.2018
comment
Я новичок в веб-разработке в целом, поэтому на всякий случай предложенное мной решение имеет те же эффекты, что и синглтон, верно? Спасибо - person codebot; 29.05.2018