繁体   English   中英

使用'node-oracledb'的节点Oracle DB

[英]Node Oracle DB using 'node-oracledb'

因此,我试图在我的Node App中添加Oracle DB支持。 我正在使用node-oracledb来做到这一点。

由于我已经在我的应用程序中使用了MSSQL,因此我想实现一个“相似”的工作流程来使用Oracle。

现在,我使用一个类,该类使用Promise实现方法,如下所示:

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方法gets会返回插入承诺(它会检查池是否已连接,如果未连接则进行连接)。

我尝试使用与oracle相同的逻辑,从我在他们的文档中为promise读取的内容,在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(options)也返回了一个promise,我注意到它需要解决很多问题(不知道为什么,因为它没有连接)。

知道如何实现与我在此处用于MSSQL的行为相同的行为吗?

谢谢!

请参阅我在“ 数据库基础知识 ”上的文章,该文章是有关使用Node.js和Oracle Database创建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时,即会创建到数据库的连接(这就是它是异步操作的原因)。

另外,我们有一个“ 连接池缓存 ”,它允许您在创建别名时为它们分配别名,并使用oracledb.getPool()(一种同步方法)来检索别名。

在上面的示例中,由于对oracledb.getConnection()的调用没有传递任何参数,因此假定连接应来自“默认”池,这是创建的第一个池。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM