空闲 Oracle 连接给出错误“ORA-03114:未连接到 ORACLE”

Ami*_*mir 7 oracle node.js ora-03114 knex.js node-oracledb

我们有一个连接到 Oracle 数据库实例的 Node.js Web 应用程序,问题是在一些不活动之后,数据库的连接变成了只读模式。这意味着 SELECT 操作有效但 INSERT 和 UPDATE 事务遇到此错误:

“错误:ORA-03114:未连接到 ORACLE”

此问题在重新启动应用程序后解决。我们使用最新版本的 knex(0.20.1) 和 node-oracledb(4.1.0) 库连接到数据库。

Chr*_*nes 5

该错误意味着某些东西(可能是防火墙)已使连接过期。您应该找出原因并消除它。可能有一些变通方法,例如配置 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"
Run Code Online (Sandbox Code Playgroud)

这将对空闲连接执行保持活动操作,每两分钟发送一次探测。一般建议是将时间段设置为不超过连接将被终止(例如被防火墙)终止的时间的一半。请参阅技术文章Oracle Database 19c Easy Connect Plus Configurable Database Connection Syntax

其他语法可以在旧版本中使用,或者在 tnsnames.ora 文件中使用;检查文档。