我们陷入了这样一种情况,即我们的一个进程在不接触数据库的情况下需要 3 个小时的计算。在调用进程之前建立的连接被Oracle服务器关闭,任何后续查询或提交都会引发连接关闭异常。
在我们看来,这个问题与 Oracle 出于某种原因关闭了长时间空闲的连接有关。
我们尝试在 sqlnet.ora 中更改 EXPIRE_TIMEOUT,但这也无济于事。
我们能做些什么来解决这个问题?
我们陷入了这样一种情况,即我们的一个进程在不接触数据库的情况下需要 3 个小时的计算。在调用进程之前建立的连接被Oracle服务器关闭,任何后续查询或提交都会引发连接关闭异常。
在我们看来,这个问题与 Oracle 出于某种原因关闭了长时间空闲的连接有关。
我们尝试在 sqlnet.ora 中更改 EXPIRE_TIMEOUT,但这也无济于事。
我们能做些什么来解决这个问题?
尝试使用连接时遇到什么错误?
默认情况下,Oracle 不会由于不活动而关闭连接。您可以使用 IDLE_TIME 配置配置文件以使 Oracle 关闭非活动连接,但听起来您并没有这样做。您还可以配置 Oracle 以检测死连接并在客户端没有响应时关闭连接——如果客户端被埋三个小时,它可能没有及时响应。但这似乎不太可能是广告需要额外的配置步骤。
根据我的经验,更有可能的情况是您的网络正在断开连接。例如,如果您通过防火墙进行连接,防火墙会频繁关闭空闲时间过长的连接。
您收到的实际 Oracle 错误消息将指出这些替代方案中的哪一个导致了您的问题。
伊尔凡,
请确保 init.ora 文件中的 resource_limit=TRUE 以使更改生效。
另外,请检查您尝试为其设置限制的用户是否已分配给默认配置文件。
select profile from dba_users where username = 'TEST_USER'; PROFILE1
从 dba_profiles 中选择 profile、resource_name、limit,其中 profile='PROFILE1' 和
resource_name ='IDLE_TIME'
3 如果用户被分配到自定义配置文件,请确保自定义配置文件的参数已相应设置。您还应该查看 connect_time 参数(在适用于您的默认或自定义配置文件中。一旦超过连接时间,连接将终止。)
最后请注意,如果当前会话在参数设置之前开始,则不会生效。更改仅在您进行更改后的下一个会话中生效。
有用的链接。
http://www.adp-gmbh.ch/blog/2005/april/17.html
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431
谢谢,
拉杰什
似乎实际原因与@Justin Cave在他的回答中提到的connection closed exception
相同:
根据我的经验,更有可能的情况是您的网络正在断开连接。例如,如果您通过防火墙进行连接,防火墙会频繁关闭空闲时间过长的连接。
您收到的实际 Oracle 错误消息将指出这些替代方案中的哪一个导致了您的问题。
如果仍然有人想知道配置文件IDLE_TIME
的CONNECT_TIME
配置,那么可以执行以下查询:
select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');
无论您使用什么数据库,当您想使用它时,假设您的连接将处于活动状态是一个坏主意。处理此问题的一种方法是创建一个函数以返回与相关数据库的活动连接,并在每次需要给定数据库的句柄/对象/任何内容时调用它。该例程维护一个数据库列表及其关联的连接对象。如果在调用函数时连接对象是活动的,一切都很好,并且在函数对其执行某些操作以说服数据库保持句柄/对象/任何东西打开后返回对象。如果没有实时连接对象,则例程会打开一个新连接对象并返回它。有第二个例程在 1 分钟左右后到期的计时器上驻留是很有用的。当计时器到期并调用第二个例程时,它会查看数据库连接列表,查找在一定时间内没有活动的连接(明显小于数据库的会话超时值)。那些长时间不活动的会被关闭和清理。