Я создаю 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, верно?