REST MVC体系结构中的initOracleClient在哪里



我设置了具有多个路由的快速路由,每个路由使用不同的Oracle连接。我必须在getConnection之前调用initOracleClient,但当我尝试在两个路由中初始化initOracleClient时,我会收到一个错误(错误:NJS-077:Oracle客户端库已经初始化(。我已经尝试将initOracleClient移动到结构中的不同位置;在应用程序级别和路由级别。在REST MVC结构中,您在哪里初始化客户端?

RESTMVC应用程序通常具有一些支持基础设施。也就是说,MVC并不是关于如何构建整个程序代码的完整蓝图,只是关于如何分配某些职责的一般经验法则。

您正在使用的库需要初始化,显然这段代码应该只执行一次。有几种方法可以实现:

  1. 在启动express服务器之前初始化客户端一次,然后传入可供路由处理程序使用的客户端。这可能是最容易使用的,但必须延迟.listen()调用,因此应用程序开始响应HTTP的时间可能会更长
  2. 使用一种称为Singleton的模式,允许路由处理程序初始化客户端,但只能在后台执行一次初始化。根据库的初始化方式(它是否返回Promise?它是否使用回调?(,这可能需要一些仔细的设计——例如,您可能需要存储并返回Promise实例,因此多个消费者将在同一Promise上调用.then()

我按照建议实现了Singleton模式:

import oracledb from 'oracledb';
class PrivateOraInitSingleton {
constructor() {
try {
oracledb.initOracleClient({libDir: '/usr/local/lib/instantclient_19_8'});
} catch (err) {
console.error(err);
process.exit(1);
}
}
}
class OraInitSingleton {
constructor() {
throw new Error('Use OraInitSingleton.getInstance()');
}
static getInstance() {
if (!OraInitSingleton.instance) {
OraInitSingleton.instance = new PrivateOraInitSingleton();
}
return OraInitSingleton.instance;
}
}
export default OraInitSingleton;

用法:

const object = OraInitSingleton.getInstance();
try {
connectionPromise = oracledb.getConnection({
user : process.env.DB_USER,
password : process.env.DB_PASSWORD,
connectString : process.env.CONNECT_STRING
});
} catch (err) {
console.error(err);
process.exit(1);
}

相关内容

  • 没有找到相关文章

最新更新