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

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

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

我已经设置了KeepAliveInterval 1秒和KeepAliveTime在registry中的两个小时。

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

监听器的sqlnet过期时间设置为两分钟,所以它也从这一端发送keepalive。

问题是,它似乎没有工作。 在另一台机器上,我至less得到一个消息,说防火墙已经断开了应用程序服务器(这是当我发现enable = broken要求)

我如何确保保持联系被发送?

  • 从SQL Server 2005链接到oracle,这很糟糕
  • 无法在Ubuntu上安装sun jdk
  • Linux:空闲CPU的极端负载
  • 找出确切的Oracle版本
  • 为什么Oracle在networking上查询的时间只要在服务器上运行就要超过300次呢?
  • 修复Oracle 11g中过期的帐户
  • 2 Solutions collect form web for “如何确保SQL * Net Keepalive已打开?”

    为什么防火墙会断开会话? 防火墙是否设置为closures活动时间过长的连接? 或者closures已经不活动的连接太久? 如果防火墙设置为禁止持续超过一个小时的连接,则在networkingconfiguration中可能无法做任何事情 – 您需要更改防火墙的configuration。

    从架构的angular度来看,您是否真的需要从应用程序服务器运行长达一小时的进程? 通常情况下,应用程序服务器发出请求会导致数据库进程asynchronous运行(即,使用DBMS_SCHEDULERDBMS_JOB产生作业),然后让应用程序服务器监视作业的进度。 这样,你就没有连续打开一个小时的连接。 你可以给用户一些进度指示器(特别是如果使用DBMS_APPLICATION_INFO )。

    我已经设置了KeepAliveInterval 1秒和KeepAliveTime在registry中的两个小时。

    我build议5秒钟和30分钟可能是更合理的值(假设有一个5毫秒的RTT时间)。 如果防火墙已决定从其状态表中删除连接,则keepaliveinterval是无关紧要的。

    我如何确保保持联系被发送?

    在防火墙的两端都有数据包捕获

    真的,你开始寻找调查这个问题的第一个地方是在防火墙日志。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.