我有一个面向公众的应用程序服务器,可以访问位于防火墙后面的 Oracle 数据库。
通过应用程序服务器执行的某些进程可能要运行一个多小时。这会导致防火墙断开会话,而不会生成任何错误消息。这会导致进程挂起。
我在注册表中将 KeepAliveInterval 设置为 1 秒,将 KeepAliveTime 设置为 2 小时。
我在 tnsnames.ora 文件中设置了 enable=broken 选项
侦听器将 sqlnet 过期时间设置为两分钟,因此它也从该端发送保持活动。
问题是,它似乎不起作用。在另一台机器上,我至少收到一条消息,说防火墙已断开应用服务器的连接(那时我发现了 enable=broken 的要求)
我如何确保保持活动信息被发送?
答案1
防火墙为何会断开会话?防火墙是否设置为关闭活动时间过长的连接?或者关闭非活动时间过长的连接?如果防火墙设置为禁止持续超过一小时的连接,则您可能无法在网络配置中执行任何操作 - 您需要更改防火墙的配置。
从架构的角度来看,您真的需要从应用服务器运行长达一小时的进程吗?通常,更合理的方法是让应用服务器发出请求,使数据库进程异步运行(即使用DBMS_SCHEDULER
或DBMS_JOB
生成作业),然后让应用服务器监视作业的进度。这样,您就不会有一个持续打开一小时的连接。而且,您可以为用户提供某种进度指示器(特别是如果使用 来检测作业DBMS_APPLICATION_INFO
)。
答案2
我在注册表中将 KeepAliveInterval 设置为 1 秒,将 KeepAliveTime 设置为 2 小时。
我认为 5 秒和 30 分钟可能是更合理的值(并且假设 RTT 时间低于 5 毫秒)。如果防火墙已决定从其状态表中逐出连接,则 keepaliveinterval 无关紧要。
我如何确保保持活动信息被发送?
使用数据包捕获防火墙两侧
实际上,调查此问题的第一个地方是防火墙日志。