调用node-oracledb的createPool方法

时间:2018-11-19 23:45:15

标签: javascript node.js callback oracledb-npm

我正在创建一个使用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对吗?

1 个答案:

答案 0 :(得分:3)

使用连接池的node-oracledb示例是connectionpool.jsexamples/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 DockerDemo: GraphQL with Oracle Database and node-oracledb