我们在后端使用oracle和node-oracledb
,并希望使用连接池来提高性能:
oracledb.createPool({
poolAlias: 'default',
connectString: connectString,
user: user,
password: password,
poolMin: poolMin,
poolMax: poolMax
}).then(conpool => {
console.log('Connection Pool created!');
},
err => {
console.log('Error creating pool! Error:');
throw err;
});
并使用这样的连接:
public async execute (sql: string, data: object, options: object): Promise<any[]> {
try {
const con = await this.getConnection();
try {
console.log(sql);
const result = await con.execute(sql, data, { outFormat: oracledb.OBJECT, ...options });
return result.rows;
} finally {
con.release();
}
} catch (ex) {
console.log(`database.execute exception: ${ex.message}`);
throw ex;
}
}
现在,我们经常收到以下错误:
ORA-02396:超过最长空闲时间
并假设它与IDLE_TIME
有关,出于安全原因可能未将其设置为UNLIMITED
(说实话我并不理解)。
还有其他方法可以保持连接存活吗?我的意思是,由于nodejs是单线程的,我不能简单地定期执行虚拟查询吗?
答案 0 :(得分:0)
您需要在此处使用DBA,因为池的目的是准备好使用资源。
作为一种解决方法,您可以在获得连接后执行显式connection.ping(),然后在ping指示连接不可用时重新连接。这会影响可扩展性,因为这是一次额外的往返行程。到数据库。