Вызов метода createPool для node-oracledb - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю RESTful API, который использует Node.js и Express.Мое приложение использует базу данных Oracle, поэтому я установил модуль node-oracledb из npm.Я просмотрел документацию и просмотрел некоторые примеры, представленные на странице модуля github;Однако я не вижу примеров использования пула соединений.Поправьте меня, если я ошибаюсь, но для приложений, которые будут делать много обращений к базе данных, рекомендуется использовать пулы соединений, а не автономные соединения.Ниже приведен пример кода, который я написал:

createPool = function(poolAttrs, fetchPool){
  oracledb.createPool(poolAttrs, function(error, pool){
    if(error){
      console.error(`Could not create pool using specified attributes: `, error.message);
    }
    else{
      console.log(`Pool created successfully using poolAlias: ${poolAttrs.poolAlias}`);
      fetchPool(pool);
    }
  });
};

createConnection = function(poolAlias, connection){
  oracledb.getConnection(poolAlias, function(error, conn){
    if(error){
      console.error(`Could not get connection: `, error.message);
    } else {
      console.log(`New connection obtained: ${conn}`);
      connection(conn);
    }
  });
};

executeQuery = function(queryString, poolAlias){
  console.log(queryString);
  var conn = createConnection(poolAlias, function connection(conn){
    conn.execute(queryString, function(error, result){
      if(error){
        console.error(`Could not execute query: `, error.message);
      } else {
        console.log(result);
      }
      conn.close(function(error){
        if(error){
          console.error(`Could not close connection.`);
        } else {
          console.log(`Connection successfully closed.`);
        }
      })
    });
  });
}

closePool = function(pool){
  pool.close(60, function(error){
    if(error){
      console.error(`Could not close connection pool ${pool.poolAlias}`, error.message);
    } else {
      console.log(`Pool closed successfully.`);
    }
  });
};

createPool(attrs, function fetchPool(pool){
  var poolAlias = pool.poolAlias;
  console.log(poolAlias);
});

executeQuery(queryString, attrs.poolAlias);

Когда я запускаю этот код, я получаю следующую ошибку:

Could not get connection:  NJS-047: poolAlias "amDBpool" not found in the connection pool cache

Я знаю, почему происходит ошибка.Поскольку мое понимание обратных вызовов продолжается, я знаю, что вызов асинхронной функции createPool () с обратным вызовом fetchPool (pool) регистрирует этот обратный вызов (fetchPool) в стеке обратных вызовов.Весь синхронный код будет выполняться перед ним.Поэтому, когда я вызываю executeQuery и функция достигает строки выполнения, где она вызывает createConnection (poolAlias ​​...), переменная poolAlias ​​имеет значение null, поскольку функция createPool все еще ожидает выполнения в стеке обратного вызова.Следовательно, не существует пула с псевдонимом «poolAlias», и вызов не выполняется.Я знаю, что мог бы вставить вызов createPool в метод executeQuery, но разве это не попыталось бы создать новый пул каждый раз, когда я выполняю запрос?У меня вопрос, есть ли способ проверить внутри метода executeQuery, что пул существует, и если он не существует, то не пытайтесь воссоздать его.Кроме этого, единственным другим способом сделать это было бы с Promises или Async / Await, верно?

1 Ответ

0 голосов
/ 20 ноября 2018

Примерами node-oracledb с использованием пула соединений являются файлы connectionpool.js и examples/webapp*.js.Да, пул соединений был бы хорошей идеей в веб-сервисе.Также я рекомендую использовать стиль программирования async / await, поэтому посмотрите на webappawait.js.

Вы можете увидеть, как он создает пул, прежде чем делать что-либо еще:

await oracledb.createPool({
  user: dbConfig.user,
  password: dbConfig.password,
  connectString: dbConfig.connectString
});

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

let connection = await oracledb.getConnection();

Используетсяпсевдоним пула по умолчанию (который является строкой «default»), поэтому при создании или использовании пула псевдоним не указывается.

Возможно, вас заинтересуют некоторые сообщения в блоге на https://jsao.io/и http://blogs.oracle.com/opal, где веб-службы имели некоторое покрытие, например, Создание REST API с Node.js и Oracle Database , Веб-служба node-oracledb в Docker и Демонстрация: GraphQL с Oracle Database и node-oracledb

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