现在我有一些针对Oracle数据库开发的新应用程序,有时它们会崩溃或无法正确结束等等......无论如何,问题是它们有时似乎会打开它们的连接,我需要清理在他们之后。 我的问题是,是否有一种方法可以从数据库方面确定死连接并清理它们?
答案 0 :(得分:3)
这是一个页面,指的是您可以在Oracle 11g中设置的连接超时参数。我认为'放弃连接超时'是你正在寻找的。
答案 1 :(得分:2)
您可能也有兴趣杀死它们。在SQL * Plus中运行此脚本将为您提供“kill”语句列表。您可以根据sid选择要杀死的那些并运行它们。 Oracle有一些内部连接,不要杀死它们。
SELECT 'alter system kill session ''' || sid || ',' || serial# || '''; ' || sql_id death
FROM v$session
/
答案 2 :(得分:1)
我相信您正在寻找SQLNet.ora参数EXPIRE_TIME,该参数告诉数据库每隔几分钟就向客户端发送一次探测,以验证连接是否仍然存在。
答案 3 :(得分:0)
这里是如何识别要杀死的会话(你将需要SID和SERIAL#来杀死它)。我是否应该提到你需要确保你正在杀死正确的会话? sys_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秒然后返回ORA-00031 Session marked for kill
。会议仍在那里。
在这种情况下,首先检查会话是否回滚大型事务(交叉引用上面的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;
如果交易正在回滚,您将看到USED_UREC减少。让它完成回滚。
否则,ALTER SYSTEM DISCONNECT SESSION '[sid],[serial#]' IMMEDIATE;
将强制断开会话并回滚打开的事务。
上述所有信息均来自here。