Nodejs Несколько пулов создано при обновлении - PullRequest
0 голосов
/ 04 мая 2020

У меня есть несколько БД, для которых я использую пулы соединений в node.js. Каждый раз, когда я обновляю страницу sh, я думаю, что пулы создаются снова. я refre sh страница 3 раза и 3 раза обещания решены. Я удалил несколько баз данных, чтобы было легче читать здесь. enter image description here

и если я откомментирую закрытие соединения, мое приложение вылетает. я не могу понять, почему

enter image description here

const config = require("../config/config");
const oracledb = require("oracledb");

var crm1connPromise = new Promise((resolve, reject) => {
    oracledb.createPool({
        user: config.crm1.user,
        password: config.crm1.password,
        connectString: config.crm1.connectString,
        poolAlias: config.crm1.poolAlias,
        poolMin: 0,
        poolMax: 10,
        poolTimeout: 300
    }, (error, pool) => {
        if (error) {
            reject(err);
        }
        resolve("CRM1 Promise resolved")
    });
});

var query2connPromise = new Promise((resolve, reject) => {
    oracledb.createPool({
        user: config.query2.user,
        password: config.query2.password,
        connectString: config.query2.connectString,
        poolAlias: config.query2.poolAlias,
        poolMin: 0,
        poolMax: 10,
        poolTimeout: 300
    }, (error, pool) => {
        if (error) {
            reject(err);
        }
        resolve("QUERY2 Promise resolved --------")
    });
});

var promiseArray = [crm1connPromise, crm2connPromise, crm3connPromise, crm4connPromise, csfp1connPromise, csfp2connPromise, csfp3connPromise, csfp4connPromise, cact1connPromise, cact2connPromise, cact3connPromise, cact4connPromise, cospconnPromise, cchnconnPromise, bbaseconnPromise, bcdrconnPromise, vcdbconnPromise, crptconnPromise, query2connPromise];

function getDBConnection (dbname) {

    return new Promise((resolve, reject) => {
        try {
            Promise.all(promiseArray).then((message) => {
                console.log(message);
                const pool = oracledb.getPool(dbname);
                pool.getConnection( (err, connection) => {
                    if (err) {
                        reject(err);
                        console.log(err);
                    }
                    resolve(connection);
                });
            });

        } catch (error) {
            reject(error);
        }

    });
}

module.exports.query = function(dbname, sql, bind = []){
    return new Promise ((resolve,reject) =>{
        var conn
        try {
            getDBConnection(dbname).then((connection) =>{
                connection.execute(sql,bind,(err,result)=>{
                    if (err){
                        reject(err);
                    }
                    resolve(result);
                })
                //connection.close(0);
            })
        } catch (error) {
            reject(error);
        }
    })
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Посмотрите на пример node-oracledb webappawait. js, который запускает пул вне пути кода веб-прослушивателя.

async function init() {
  try {
    await oracledb.createPool({
      user: dbConfig.user,
      password: dbConfig.password,
      connectString: dbConfig.connectString
     });

    const server = http.createServer();
    server.on('error', (err) => {
      console.log('HTTP server problem: ' + err);
    });
    server.on('request', (request, response) => {
      handleRequest(request, response);
    });
    await server.listen(httpPort);
    console.log("Server is running at http://localhost:" + httpPort);

  } catch (err) {
    console.error("init() error: " + err.message);
  }
}


async function handleRequest(request, response) {

 . . .

}
0 голосов
/ 04 мая 2020

Вы можете использовать 'Singleton'

, пожалуйста, Google 'Шаблон Singleton' и примеры.

как это:

dataBaseManager. js:

'use strict'

var Singleton = (function () {
    var instance;

    function createInstance() {
        var object = new dataBaseManager();
        return object;
    }

    return {
        getInstance: function () {
            if (!instance) {
                instance = createInstance();
            }
            return instance;
        }
    };
})();

function dataBaseManager() {
    this.connected = false;
    this.client = null;
    this.dataBase = null;

    //public methods
    this.connect = function () {
        try {

            your_database.connect({}, (err, client) => {
                if (err) {
                    this.connected = false;
                    this.client = null;
                    this.dataBase = null;
                    return;
                }
                this.connected = true;
                this.client = client;
                this.dataBase = client.db();
            });

        } catch (error) {

        }
    };
    this.disconnect = function () {
        try {
            if (this.client) {
                this.client.close();
                this.connected = false;
                this.client = null;
                this.dataBase = null;
            }

        } catch (error) {

        }
    }
}

module.exports = Singleton;

хранилище. js:

const dataBaseManager = require("./dataBaseManager").getInstance();

your_get_dample_data_from_data_base_func = function (data) {
  dataBaseManager.dataBase
    .find({})
    .toArray(function (err, result) {
      if (err) {
        return callback(err, null);
      }
      callback(null, result);
    });
};

index. js:

const dataBaseManager = require("./dataBaseManager").getInstance();

function connect() {
  dataBaseManager.connect();
}

function disconnect() {
  dataBaseManager.disconnect();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...