0

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

4

1 回答 1

0

您需要在这方面与 DBA 合作,因为池的目的是让资源准备好使用。

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

于 2018-04-26T02:00:01.650 回答