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