Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Oracle清理死连接?_Oracle - Fatal编程技术网

如何使用Oracle清理死连接?

如何使用Oracle清理死连接?,oracle,Oracle,现在我有一些新的应用程序正在针对Oracle数据库开发,有时会崩溃或无法正确结束,等等。。。不管怎么说,问题是他们有时似乎让他们的连接保持打开状态,我需要在他们之后进行清理。 我的问题是,从数据库的角度来看,是否有办法确定死连接并清除它们?这里有一个页面,介绍了可以在其中设置的连接超时参数。我认为“放弃连接超时”正是你想要的 你也可能对杀死它们感兴趣。在SQL*Plus中运行此脚本将提供一个“kill”语句列表。您可以根据sid选择要杀死的对象并运行它们。Oracle有一些自己的内部连接,不要杀

现在我有一些新的应用程序正在针对Oracle数据库开发,有时会崩溃或无法正确结束,等等。。。不管怎么说,问题是他们有时似乎让他们的连接保持打开状态,我需要在他们之后进行清理。
我的问题是,从数据库的角度来看,是否有办法确定死连接并清除它们?

这里有一个页面,介绍了可以在其中设置的连接超时参数。我认为“放弃连接超时”正是你想要的

你也可能对杀死它们感兴趣。在SQL*Plus中运行此脚本将提供一个“kill”语句列表。您可以根据sid选择要杀死的对象并运行它们。Oracle有一些自己的内部连接,不要杀死它们

SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';     ' || sql_id death
FROM v$session
/

我相信您正在寻找SQLNet.ora参数,该参数告诉数据库每隔几分钟向客户端发送一次探测,以验证连接是否仍处于活动状态。

以下是如何识别要终止的会话(您需要SID和SERIAL来终止它)。我是否应该提到你需要确保你正在结束正确的治疗
sys\u context('userenv','sid')
获取您自己会话的sid

SELECT s.inst_id,
       s.sid,
       s.serial#,
       p.spid,
       s.username,
       s.osuser,
       s.program
FROM   gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE  s.type != 'BACKGROUND';
然后,您可以按照WW的建议发出
alter system kill session'[sid],[serial#]'

但是,
alter system kill session
命令不会强制终止会话,而是要求会话终止。如果会话确实挂起,您将发现请求挂起60秒,然后返回标记为kill的
ORA-00031会话。会议还在那里

在这种情况下,首先检查会话是否没有回滚大型事务(从上面交叉引用SID和SERIAL#):

如果事务正在回滚,您将看到使用的UREC正在减少。让它完成回滚

否则,
ALTER SYSTEM DISCONNECT SESSION'[sid],[serial#]]立即
将强制断开会话并回滚打开的事务

以上所有信息都来自于

SELECT s.username,
       s.osuser,
       s.sid,
       s.serial#,
       t.used_ublk,
       t.used_urec,
       rs.segment_name,
      r.rssize,
       r.status
FROM   v$transaction t,
       v$session s,
       v$rollstat r,
       dba_rollback_segs rs
WHERE  s.saddr = t.ses_addr
AND    t.xidusn = r.usn
AND    rs.segment_id = t.xidusn
ORDER BY t.used_ublk DESC;