使用场景:数据库存在大量IDLE连接长时间没有释放,临时解决方案。
DECLARE
sess_count int;
CURSOR c_sessions
is
/* 游标获取超过10s以上的IDLE状态会话 */
SELECT * FROM
(
SELECT DATEDIFF(SS, LAST_RECV_TIME, SYSDATE) SS,
DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)),
*
FROM V$SESSIONS
WHERE STATE = 'IDLE' order by ss desc
)WHERE SS >10;
c_row c_sessions%rowtype;
begin
select count(*) into sess_count from
(
SELECT DATEDIFF(SS, LAST_RECV_TIME, SYSDATE) SS,
DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)),
*
FROM V$SESSIONS
WHERE STATE = 'IDLE' order by ss desc
)where SS >10;
/* 判断超过10秒IDLE状态会话总数超过5个,执行清理 */
if sess_count >= 5 then
for c_row in c_sessions
loop
execute immediate 'sp_close_session('''||c_row.sess_id||''')';
end loop;
end if;
end;
/
文章
阅读量
获赞