Узел Oracle DB с использованием 'node-oracledb' - PullRequest
0 голосов
/ 15 мая 2018

Итак, я пытаюсь добавить поддержку Oracle DB в моем приложении Node. Я использую node-oracledb для этого.

Поскольку я уже использую MSSQL в своем приложении, я хочу реализовать «похожий» рабочий процесс для использования Oracle.

Сейчас я использую класс, который реализует методы с использованием обещаний, например:

class db {

    constructor(){
        this._pool = null;
    }

    get_pool(){
       //for MSSQL
       if (!this._pool) {
           this._pool = new mssql.ConnectionPool(sqlDbOptions);
       }

       //connect pool
       if (!this._pool.connected){
           return this._pool.connect();
       }
       else{
           return new Promise((resolve, reject) => {
               resolve(this._pool);
           })
       }
    }

    insert(sql){
        return this.get_pool().then((pool) => {...
        ....
        ....
    }
}

Как вы можете видеть, вызов метода вставки возвращает обещание вставки после получения пула от get_pool () (которая проверяет, подключен ли пул, и подключает его, если это не так).

Я пытался использовать ту же логику для оракула, из того, что я читаю в их документах для обещаний, используя что-то вроде этого в get_pool ():

if (!this._pool){
    this._pool = new oracle.createPool(oracleDbOptions);
}

if (this._pool.connectionsOpen == 0){
    return this._pool.getConnection();
}
else{
    return new Promise((resolve, reject) => {
        resolve(this._pool);
    })
}

Это не работает, так как по какой-то причине oracle.createPool (options) также возвращает обещание, которое, как я заметил, требует много времени для решения (не знаю почему, поскольку оно не подключается).

Есть идеи, как добиться того же поведения, которое я использовал для MSSQL здесь?

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Взгляните на мой пост " Основы баз данных ", часть серии, посвященной созданию REST API с Node.js и Oracle Database.

Обычно я выступаю за создание и закрытиевниз по пулу как часть вашего кода запуска и завершения работы.Затем я использую функцию, подобную этой, чтобы упростить простые выполнения, которые не нуждаются в транзакции:

function simpleExecute(statement, binds = [], opts = {}) {
  return new Promise(async (resolve, reject) => {
    let conn;

    opts.outFormat = oracledb.OBJECT;
    opts.autoCommit = true;

    try {
      conn = await oracledb.getConnection();

      const result = await conn.execute(statement, binds, opts);

      resolve(result);
    } catch (err) {
      reject(err);
    } finally {
      if (conn) { // conn assignment worked, need to close
        try {
          await conn.close();
        } catch (err) {
          console.log(err);
        }
      }
    }
  });
}

Обратите внимание, что при использовании node-oracledb при вызове oracledb.createPool соединения с базой данных создаются вна этот раз (именно поэтому это асинхронная операция).

Кроме того, у нас есть « кэш пула соединений », который позволяет назначать псевдонимы пулам при их создании и извлекать их с помощьюoracledb.getPool (), который является синхронным методом.

В приведенном выше примере, поскольку при вызове oracledb.getConnection () не передаются никакие параметры, предполагается, что соединение должно исходить изпул «по умолчанию», который является первым созданным пулом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...