所以我试图在我的Node App中添加Oracle DB支持。我使用node-oracledb来执行此操作。
由于我已经在我的应用程序中使用MSSQL,我想要实现一个类似的'使用Oracle的工作流程。
现在我使用一个使用promises实现方法的类,如下所示:
class db {
constructor(){
this._pool = null;
}
get_pool(){
//for MSSQL
if (!this._pool) {
this._pool = new mssql.ConnectionPool(sqlDbOptions);
}
//connect pool
if (!this._pool.connected){
return this._pool.connect();
}
else{
return new Promise((resolve, reject) => {
resolve(this._pool);
})
}
}
insert(sql){
return this.get_pool().then((pool) => {...
....
....
}
}
正如您所看到的,在从get_pool()获取池后,调用insert方法获取返回插入promise(它会检查池是否已连接,如果不是,则连接它)。
我尝试使用相同的oracle逻辑,从我在他们的docs中读取承诺,在get_pool()中使用类似的东西:
if (!this._pool){
this._pool = new oracle.createPool(oracleDbOptions);
}
if (this._pool.connectionsOpen == 0){
return this._pool.getConnection();
}
else{
return new Promise((resolve, reject) => {
resolve(this._pool);
})
}
这不起作用,因为某些原因,oracle.createPool(选项)也返回一个promise,我注意到需要解决很多(不知道为什么,因为它没有连接)。
知道如何实现与我在MSSQL中使用的行为相同的行为吗?
谢谢!
答案 0 :(得分:2)
查看关于" Database Basics"的帖子,这是关于使用Node.js和Oracle数据库创建REST API的系列文章的一部分。
我一般主张创建和关闭池作为启动和关闭代码的一部分。然后我使用这样的函数来简化不需要事务的简单执行:
function simpleExecute(statement, binds = [], opts = {}) {
return new Promise(async (resolve, reject) => {
let conn;
opts.outFormat = oracledb.OBJECT;
opts.autoCommit = true;
try {
conn = await oracledb.getConnection();
const result = await conn.execute(statement, binds, opts);
resolve(result);
} catch (err) {
reject(err);
} finally {
if (conn) { // conn assignment worked, need to close
try {
await conn.close();
} catch (err) {
console.log(err);
}
}
}
});
}
请注意,对于node-oracledb,当您调用oracledb.createPool时,会在此时创建与数据库的连接(这就是为什么它是异步操作)。
此外,我们有一个" Connection Pool Cache",它允许您在创建池时为池分配别名,并使用oracledb.getPool()检索它们,这是一种同步方法。
在上面的示例中,因为对oracledb.getConnection()的调用没有传递给它的任何参数,所以它假设连接应来自"默认" pool,这是第一个创建的池。