ORA-02396:使用node-oracledb超出了最大空闲时间

时间:2018-04-24 13:22:06

标签: oracle11g node-oracledb

我们在后端使用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是单线程的,我不能简单地定期执行虚拟查询吗?

1 个答案:

答案 0 :(得分:0)

您需要在此处使用DBA,因为池的目的是准备好使用资源。

作为一种解决方法,您可以在获得连接后执行显式connection.ping(),然后在ping指示连接不可用时重新连接。这会影响可扩展性,因为这是一次额外的往返行程。到数据库。