Вызов метода 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