我们遇到的情况是,我们的某个流程在不触及数据库的情况下需要3个小时的计算时间。调用进程之前所做的连接被Oracle服务器关闭,并且任何后续查询或提交都会引发连接关闭异常。
在我们看来,问题与Oracle因某种原因关闭长时间闲置的连接有关。
我们尝试更改sqlnet.ora中的EXPIRE_TIMEOUT,但这也无济于事。
我们可以做些什么来解决这个问题?
答案 0 :(得分:8)
尝试使用连接时出现的错误是什么?
默认情况下,Oracle不会因为不活动而关闭连接。您可以使用IDLE_TIME配置配置文件以使Oracle关闭非活动连接,但听起来并不像您那样做。如果客户端没有响应,您还可以将Oracle配置为检测死连接并关闭连接 - 如果客户端被埋了三个小时,则可能无法及时响应。但这似乎不太可能需要额外的配置步骤。
我的体验中更可能出现的情况是您的网络正在断开连接。例如,如果您通过防火墙进行连接,防火墙将经常关闭空闲时间过长的连接。
您收到的实际Oracle错误消息将指出哪些替代方案导致您的问题。
答案 1 :(得分:4)
伊尔凡,
请确保您在init.ora文件中有resource_limit = TRUE,以使更改生效。
另外,请检查您尝试设置限制的用户是否已分配到默认配置文件。
select profile from dba_users where username = 'TEST_USER'; PROFILE1
选择个人资料,resource_name,限制 来自dba_profiles在哪里 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
谢谢,
拉杰什
答案 2 :(得分:0)
无论您使用什么数据库,在您想要使用它时,假设您的连接将会存在,这是一个坏主意。处理此问题的一种方法是创建一个函数来返回有问题的数据库的活动连接,并在每次需要给定数据库的句柄/对象/任何内容时调用它。例程维护数据库及其关联的连接对象的列表。如果连接对象在调用函数时是正常的,那么在函数执行某些操作之后会返回该对象,以说服数据库保持句柄/对象/任何打开状态。如果没有实时连接对象,则例程将打开一个新对象并返回该对象。让第二个例程在1分钟左右到期的计时器上运行是很有用的。当计时器到期并且第二个例程被调用时,它会查看数据库连接列表,查找在一段时间内没有活动的事件(显着低于数据库的会话超时值)。那些长时间不活动的人会被关闭并清理干净。
答案 3 :(得分:0)
似乎connection closed exception
的实际原因与答案中提到的 @Justin Cave 相同:
我的体验中更可能出现的情况是您的网络 放弃连接。如果你通过防火墙连接,为 例如,防火墙将经常关闭已经连接的连接 闲着太久了。
您收到的实际Oracle错误消息将指明哪个 这些替代方案正在引发您的问题。
如果仍有人想知道为个人资料配置的IDLE_TIME
和CONNECT_TIME
,则可以执行以下查询:
select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');