![](/img/trans.png)
[英]Error closing node-oracledb pool connections with Oracle DB and Node.js
[英]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.