某进程处理数据失败,导致Session连接无法正常断开,如果此进程频繁操作数据,会导致Oracle系统的Session连接数超出了默认的上限值150。
具体处理方法:
1、创建一个存储过程,用于定时删除产生异常而不能正常断开的Session。
PROCEDURE KILL_SESSION
IS
V_SQL_STR VARCHAR2 (300);
BEGIN
FOR T IN (SELECT SID, USERNAME, PADDR, STATUS, serial# FROM V$SESSION
WHERE USERNAME = 'USER_ABC' AND STATUS IN ('INACTIVE', 'KILLED')
AND UPPER(PROGRAM) = '某进程.EXE' AND LOGON_TIME < SYSDATE - 20/1440)
LOOP
V_SQL_STR := 'ALTER SYSTEM KILL SESSION ''' || T.SID || ',' || T.SERIAL# || ''' IMMEDIATE';
EXECUTE IMMEDIATE V_SQL_STR;
END LOOP;
END KILL_SESSION;
2、新建一个job定时去执行就可以了。
通过这种方法,可以把Oracle中Session状态为Inactive和Killed直接终止掉。
(注:这里的连接时间我设置为20分钟。执行Kill Session操作一般会经历两个阶段,首先INACTIVE会变为KILLED。此时不处理,Session很难被系统回收掉。所以
再执行一次Kill操作,则可以将加速处理死锁和回滚。)