我正在创建一个使用Node.js和Express的RESTful API。我的应用程序使用Oracle数据库,因此我从npm安装了node-oracledb模块。我浏览了文档,并查看了该模块的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
我知道为什么会发生错误。就我对回调的理解而言,我知道使用fetchPool(pool)回调调用异步createPool()函数会将此回调(fetchPool)注册在回调堆栈中。所有同步代码将在其之前执行。因此,当我调用executeQuery且函数到达执行行时,在该行调用createConnection(poolAlias ...)时,poolAlias变量为null,因为createPool函数仍在回调堆栈中等待执行。因此,不存在别名为“ poolAlias”的池,并且调用失败。我知道我可以将对createPool的调用保留在executeQuery方法中,但是那不是在每次执行查询时尝试创建一个新池吗?我的问题是,有没有一种方法可以在executeQuery方法内部测试该池是否存在,如果不存在,则不要尝试重新创建它。除此之外,唯一的其他方法就是使用Promises或Async / Await对吗?
答案 0 :(得分:3)
使用连接池的node-oracledb示例是connectionpool.js和examples/webapp*.js
文件。是的,在网络服务中,连接池将是一个好主意。另外,我建议您使用异步/等待方式的编程方式,因此请查看webappawait.js
。
您可以看到它先创建了池:
/plugins
从await oracledb.createPool({
user: dbConfig.user,
password: dbConfig.password,
connectString: dbConfig.connectString
});
调用返回的池将被忽略,因为以后没有通过凭证传递到oracledb.createPool()
来通过pool cache访问该池:
getConnection()
这使用默认的池别名(恰好是字符串“ default”),因此在创建或使用池时未指定别名。
您可能对https://jsao.io/和http://blogs.oracle.com/opal上的一些博客文章感兴趣,这些博客文章对Web服务有一定的报道,例如Creating a REST API with Node.js and Oracle Database, A node-oracledb Web Service in Docker和Demo: GraphQL with Oracle Database and node-oracledb