我们有一个连接到 Oracle 数据库实例的 Node.js Web 应用程序,问题是在一些不活动之后,数据库的连接变为只读模式。这意味着 SELECT 操作有效,但 INSERT 和 UPDATE 事务遇到此错误:
“错误:ORA-03114:未连接到 ORACLE”
此问题在重新启动应用程序后解决。我们使用最新版本的 knex(0.20.1) 和 node-oracledb(4.1.0) 库来连接数据库。
我们有一个连接到 Oracle 数据库实例的 Node.js Web 应用程序,问题是在一些不活动之后,数据库的连接变为只读模式。这意味着 SELECT 操作有效,但 INSERT 和 UPDATE 事务遇到此错误:
“错误:ORA-03114:未连接到 ORACLE”
此问题在重新启动应用程序后解决。我们使用最新版本的 knex(0.20.1) 和 node-oracledb(4.1.0) 库来连接数据库。
该错误意味着某些东西(可能是防火墙)已使连接过期。您应该追查原因并消除它。可能有一些变通方法,例如配置 Oracle Net 层以通过网络发送偶尔的 ping 以阻止空闲连接被终止,请参阅https://oracle.github.io/node-oracledb/doc/api.html#connectionha
查询和 DML 将同样受到产生错误的连接的影响 - 都将失败。我怀疑您正在为查询使用不同的(新)连接。
如果您使用的是 19c 客户端库(顺便说一下,它连接到 Oracle DB 11.2 或更高版本),那么您的连接字符串可以使用 Easy Connect 语法,例如:
"mydbmachine.example.com/orclpdb1?expire_time=2"
这将对空闲连接执行保活操作,每两分钟发送一次探测。一般的建议是将周期设置为小于连接终止时间的一半(例如通过防火墙)。请参阅技术文章Oracle Database 19c Easy Connect Plus 可配置数据库连接语法。
其他语法可以在旧版本中使用,或者在 tnsnames.ora 文件中使用;检查文档。