【问题标题】:Release PostgeSQL connection Pool in Nodejs在 Node Js 中释放 PostgreSQL 连接池
【发布时间】:2021-07-13 14:13:30
【问题描述】:

我正在尝试使用连接池方法将我的应用程序连接到数据库,它的连接正常,并且数据插入正常进行,没有任何问题,但同一文件中的其他查询速度变慢。

我试过 release() 方法也不能正常工作。

一旦执行当前查询,如何将池释放到下一个查询?

下面是我的 dbpool.js 文件代码,我在其中编写了一个通用的通用数据库连接,

var pg = require('pg');

var PGUSER = 'postgres';
var PGDATABASE = 'test_database';

var config = {
    user: PGUSER, // name of the user account
    host: 'localhost',
    database: PGDATABASE, // name of the database
    password: 'password@AWS',
    port: 5432,
    max: 10, 
    idleTimeoutMillis: 10000 
};

const pool = new pg.Pool(config);

const DB = {
    query: function(query, callback) {

        pool.connect((err, client, done) => {
              if(err){ return callback(err); }
              client.query(query, (err, results) => {
                 // done();
                 client.release();
                 
                 // if(err) { console.error("ERROR: ", err) }
                 if(err) { return callback(err); }
                 
                 callback(null, results.rows);
             })
        });
    }
};

module.exports = DB;

我尝试了 done() 和 client.release() 方法,但没有运气。如果我同时使用两者,则会收到错误消息客户端已发布。

下面是我的socket.js文件代码:

var express = require('express');
const connection = require('./dbpool.js');

if(arData == '0022'){
    const queryText = "INSERT INTO alert(alert_data) VALUES('"+arData+"')";
    connection.query(queryText,(err, res) => {
       if(err){
           console.log(err.stack);
       }
    });
}

if(arData == '0011'){
    const queryText = "INSERT INTO table2(alert_data) VALUES('"+arData+"')";
    connection.query(queryText,(err, res) => {
       if(err){
           console.log(err.stack);
       }
    });
}

function ReverseCommunication(){
     const select1 = "SELECT * FROM alert WHERE action = '0' ORDER BY alert_id ASC LIMIT 1";
     connection.query(select1, (err, res) =>{
        if(err) {
            console.log("Error1");
            res.json({"error":true});
        }
        else{
            console.log("res==",res);
        }
     });
}

setInterval(function(){
    ReverseCommunication();
}, 2000)

【问题讨论】:

    标签: javascript node.js postgresql express


    【解决方案1】:

    使用池,您不需要关闭连接。使用 pool 它将为后续请求重用连接池,因此您不必每次都连接到数据库。

    (我不是这里的 PG 专家,肯定其他人可以比我更好地扩展这种方式)

    对我们有用的是像这样设置您拥有的 dbpool 文件

    const {Pool,Client} = require('pg');
    
    const pool = new Pool({
    user: process.env.POSTGRES_USER,
    host: process.env.POSTGRES_URL,
    database: process.env.POSTGRES_DATABASE,
    password: process.env.POSTGRES_PASSWORD,
    port:  process.env.POSTGRES_PORT,
    keepAlive: true,
    connectionTimeoutMillis: 10000, // 10 seconds
    max: 10
    });
    pool.connect()
    .then(() => console.log('pg connected'))
    .catch(err => console.error(err))
    
    module.exports  =  pool 
    

    然后像现在使用 pool.connect 一样使用 pool.query

    另外,请注意您为 PG 使用的库是什么?注意到您的查询是动态的,您可能需要调整这些以防止可能的 SQL 注入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2013-05-01
      • 2016-10-24
      • 2012-04-22
      • 2015-12-04
      • 2013-03-10
      • 2017-05-26
      相关资源
      最近更新 更多