节点Oracle数据库使用' node-oracledb'

时间:2018-05-15 14:22:21

标签: node.js oracle

所以我试图在我的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中使用的行为相同的行为吗?

谢谢!

1 个答案:

答案 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,这是第一个创建的池。