Вызов метода createPool для node-oracledb

Я создаю 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 ответ

Примеры node-oracledb с использованием пула соединений: 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, Web-сервис node-oracledb в Docker и Demo: GraphQL с базой данных Oracle и node-oracledb

Другие вопросы по тегам