pg pool - 什么是利用具有超时功能的pg池的正确方法

时间:2017-08-17 09:08:16

标签: node.js postgresql connection-timeout node-pg-pool

我需要一些关于pg npm的帮助。

我已经阅读了很多写作和示例,并且对于以正确的方式使用pg池完全感到困惑。很多文章都是我读过的文章。

我想向您展示我的一些代码以及我如何构建围绕db的所有内容。我很少关心需要你的支持。

这就是我实施的方式:

我只在服务器启动时与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 个答案:

答案 0 :(得分:0)

我知道这是一个古老的问题,并且是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);
}