如何确保 SQL*Net keepalive 已打开?

如何确保 SQL*Net keepalive 已打开?

我有一个面向公众的应用程序服务器,可以访问位于防火墙后面的 Oracle 数据库。

通过应用程序服务器执行的某些进程可能要运行一个多小时。这会导致防火墙断开会话,而不会生成任何错误消息。这会导致进程挂起。

我在注册表中将 KeepAliveInterval 设置为 1 秒,将 KeepAliveTime 设置为 2 小时。

我在 tnsnames.ora 文件中设置了 enable=broken 选项

侦听器将 sqlnet 过期时间设置为两分钟,因此它也从该端发送保持活动。

问题是,它似乎不起作用。在另一台机器上,我至少收到一条消息,说防火墙已断开应用服务器的连接(那时我发现了 enable=broken 的要求)

我如何确保保持活动信息被发送?

答案1

防火墙为何会断开会话?防火墙是否设置为关闭活动时间过长的连接?或者关闭非活动时间过长的连接?如果防火墙设置为禁止持续超过一小时的连接,则您可能无法在网络配置中执行任何操作 - 您需要更改防火墙的配置。

从架构的角度来看,您真的需要从应用服务器运行长达一小时的进程吗?通常,更合理的方法是让应用服务器发出请求,使数据库进程异步运行(即使用DBMS_SCHEDULERDBMS_JOB生成作业),然后让应用服务器监视作业的进度。这样,您就不会有一个持续打开一小时的连接。而且,您可以为用户提供某种进度指示器(特别是如果使用 来检测作业DBMS_APPLICATION_INFO)。

答案2

我在注册表中将 KeepAliveInterval 设置为 1 秒,将 KeepAliveTime 设置为 2 小时。

我认为 5 秒和 30 分钟可能是更合理的值(并且假设 RTT 时间低于 5 毫秒)。如果防火墙已决定从其状态表中逐出连接,则 keepaliveinterval 无关紧要。

我如何确保保持活动信息被发送?

使用数据包捕获防火墙两侧

实际上,调查此问题的第一个地方是防火墙日志。

相关内容