【问题标题】:Node JS pg Pool auto reconnect if Postgres service restart. Client reconnects but see multiple sessions. Normal start up only should see one如果 Postgres 服务重新启动,节点 JS pg 池会自动重新连接。客户端重新连接但看到多个会话。正常启动只应该看到一个
【发布时间】:2022-01-12 05:48:29
【问题描述】:

下面的代码在 Postgres 服务器关闭时有效。在它回来并且套接字可用后,请查看多个连接。通常在 js 的干净启动时它只显示一个连接,在重新连接时我有时会看到超过 5 个。 任何想法为什么?

var express = require('express');
const app = express();
const fs = require("fs-extra");

const bodyParser = require('body-parser');
const R = require('ramda');

require ('dotenv').config();
var reconnectLoop = 0;
var sleepInterval = 0;
var pg = require('pg');
const pool = {
user: process.env.DB_USER,
host: process.env.DB_SERVER,
database: process.env.DB_NAMESPACE,
password: process.env.DB_PASSWORD,
port: process.env.DB_PORT,
max: 1,
connectionTimeoutMillis: 2000
};


let date_ob = new Date();

// current date
// adjust 0 before single digit date
let date = ("0" + date_ob.getDate()).slice(-2);
// current month
let month = ("0" + (date_ob.getMonth() + 1)).slice(-2);
// current year
let year = date_ob.getFullYear();
// current hours
let hours = date_ob.getHours();
// current minutes
let minutes = date_ob.getMinutes();
// current seconds
let seconds = date_ob.getSeconds();


let client;
const postgresDBConnect = () => {
    const startedAt = new Date().getTime();
    
    client = new pg.Client(pool)
    
    client.on('error', (err) => {
        console.log('startedAt:-', startedAt);
        console.log('crashedAt:-', new Date().getTime());
        
        //Reconnect
        reconnectLoop = reconnectLoop + 1;
        sleepInterval = reconnectLoop * 1000;
        console.log('Trying Reconnect1' + ' Sleep Timeout ' + sleepInterval);
        setTimeout(postgresDBConnect,sleepInterval);
                
    });


    client.connect(err => {
    if (err) {
        console.error('Connection issue:', err.stack)
        reconnectLoop = reconnectLoop + 1
        sleepInterval = 1000 * reconnectLoop
        console.log('Trying Reconnect2' + '. Sleep Timeout ' + sleepInterval)
        setTimeout(postgresDBConnect,sleepInterval)
        
    } else {
        console.log('Connected to Postgres Server') 
    }
    });

};

console.log('Starting UP Postgres Connection');
postgresDBConnect();

var user = {}
app.use(bodyParser.json());

app.post('/post-test', (req, res) => {
    console.log('Got body:', req.body);
    res.sendStatus(200);
});

app.post('/insertactivity', function (req, res) {
        console.log('InsertActivity, Got body:', req.body);
        res.sendStatus(200);
    var string = JSON.stringify(req.body);
        var objectValue = JSON.parse(string);
       
        console.log('currenttime:',objectValue["domain_activity"]["currenttime"]);
        console.log('username:',objectValue["domain_activity"]["username"]);
        console.log('domain:',objectValue["domain_activity"]["domain"]);
        console.log('computer:',objectValue["domain_activity"]["computer"]);
        console.log('ipaddr:',objectValue["domain_activity"]["ipaddr"]);
        console.log('action:',objectValue["domain_activity"]["action"]);
        console.log('macaddr:',objectValue["domain_activity"]["macaddr"]);
        console.log('uuid:',objectValue["domain_activity"]["uuid"]);

objdata1 = objectValue["domain_activity"]["currenttime"];
objdata2 = objectValue["domain_activity"]["username"];
objdata3 = objectValue["domain_activity"]["domain"];
objdata4 = objectValue["domain_activity"]["computer"];
objdata5 = objectValue["domain_activity"]["ipaddr"];
objdata6 = objectValue["domain_activity"]["action"];
objdata7 = objectValue["domain_activity"]["macaddr"];
objdata8 = objectValue["domain_activity"]["uuid"];

client.query(`insert into public.authentication_activity (currenttime,username,domain,computer,ipaddr,action,macaddr,uuid) values (
'${objdata1}',
'${objdata2}',
'${objdata3}',
'${objdata4}',
'${objdata5}',
'${objdata6}',
'${objdata7}',
'${objdata8}')`).then(res => {

    }).catch(err => {
            console.log(err.stack);
        })
//.finally(() => {
   // client.end()
});

app.post('/updateactivity', function (req, res) {
        console.log('UpdateActivity, Got body:', req.body);             
    res.sendStatus(200);
        var string = JSON.stringify(req.body);
        var objectValue = JSON.parse(string);
        console.log('username:',objectValue["domain_activity"]["username"]);
        console.log('uuid:',objectValue["domain_activity"]["uuid"]);

objdata9 = objectValue["domain_activity"]["username"];
objdata10 = objectValue["domain_activity"]["uuid"];

client.query(`select public.sessionduration ('${objdata9}','${objdata10}')`).then(res => {
    }).catch(err => {
        console.log(err.stack);
        })
//.finally(() => {
   // client.end()
});


var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Server.js app listening at http://%s:%s", host, port)
})


// prints date & time in YYYY-MM-DD HH:MM:SS format

console.log(date + "/" + month + "/" + year + " " + hours + ":" + minutes + ":" + seconds);

【问题讨论】:

    标签: postgresql pg


    【解决方案1】:

    通过添加 client.end() 修复 现在只看到一个连接是 postgres 重启了

    client.connect(err => {
        if (err) {
            console.error('Connection issue:', err.stack)
            reconnectLoop = reconnectLoop + 1
            sleepInterval = 1000 * reconnectLoop
            console.log('Trying Reconnect2' + '. Sleep Timeout ' + sleepInterval)
            client.end()
            setTimeout(postgresDBConnect,sleepInterval)
            
        } else {
            console.log('Connected to Postgres Server') 
        }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2018-02-10
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多