Oracel 杀无效进程

一、编写存储过程

     说明:由于前端通过jdbc调用Oracle数据库,在session中产生大量的不能释放的Oracle链接,导致Oracle效率低下,通过定期清除无用的链接,减轻Oracle压力,防止达到Oracl链接上限(一般默认是1000个),具体代码详见下文。

/*-------------------------------------------------------------------------------------*/
/* */
/* (C) Copyright IEDS Corporation 2017 All Rights Reserved. */
/* */
/* 函数名称 :PROC_KILL_INACTIVE_SESSIONS */
/* 功能说明 :杀无效进程 */
/* 参数说明 : */
/* 参数 (I/O) 类型 说明 */
/* 返回值说明 : */
/* 无 */
/* 详细说明 : */
/* 维度频率 :无 */
/* ORIGINAL : (1.0) 2017-05-25 CODED BY [IEDS] JINWEI */
/*-------------------------------------------------------------------------------------*/

PROCEDURE PROC_KILL_INACTIVE_SESSIONS AS
V_SID NUMBER;
V_SERIAL NUMBER;
V_INST_ID NUMBER;
V_MODULE VARCHAR2(100);
V_STATUS VARCHAR2(100);
V_PROGRAM VARCHAR2(100);
V_MACHINE VARCHAR2(100);
V_OSUSER VARCHAR2(100);
V_LOGIN_TIME DATE;
V_SQL VARCHAR2(1000);
V_PROC_MSG VARCHAR2(200);
VDAYS NUMBER;

CURSOR C is
select sid,
serial#,
inst_id,
module,
status,
program,
machine,
logon_time,
v.OSUSER
from gv$session v
where type != 'BACKGROUND'
and status IN ('INACTIVE' /*,'KILLED'*/)
and (sysdate - v.LOGON_TIME) > VDAYS
and username = 'YDJC'
and v.PROGRAM like '%JDBC%';
BEGIN
--无效jdbc链接天数
VDAYS := 3;
--打开游标
open C;
loop
BEGIN
fetch C
into V_SID,
V_SERIAL,
V_INST_ID,
V_MODULE,
V_STATUS,
V_PROGRAM,
V_MACHINE,
V_LOGIN_TIME,
V_OSUSER;
exit when C%notfound;

V_SQL := 'alter system disconnect session ''' || V_SID || ',' ||
V_SERIAL || ''' immediate';
execute immediate V_SQL;

EXCEPTION
WHEN OTHERS THEN
V_PROC_MSG := 'disconnect SESSION_SID=' || V_SID || ' 失败:';
V_PROC_MSG := V_PROC_MSG || 'SQLCODE(' || TO_CHAR(SQLCODE) ||
') SQLERRM(' || SUBSTR(SQLERRM, 1, 128) || ')';
--异常日志
SESSION_LOGS(V_SID,
V_SERIAL,
V_INST_ID,
V_MODULE,
V_STATUS,
V_PROGRAM,
V_MACHINE,
V_LOGIN_TIME,
V_PROC_MSG,
V_OSUSER);
END;
--正常日志
V_PROC_MSG := 'disconnect SESSION_SID=' || V_SID || '成功';
SESSION_LOGS(V_SID,
V_SERIAL,
V_INST_ID,
V_MODULE,
V_STATUS,
V_PROGRAM,
V_MACHINE,
V_LOGIN_TIME,
V_PROC_MSG,
V_OSUSER);

end loop;
close C;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END PROC_KILL_INACTIVE_SESSIONS;

二、Oracle定时调用存储过程

--begin
-- sys.dbms_scheduler.drop_job('JOB_M_STAT_JCWTXNQK_ALL');
--end;
--/
begin
sys.dbms_scheduler.create_job(job_name => 'JOB_M_STAT_JCWTXNQK_ALL',
job_type => 'PLSQL_BLOCK',
job_action => 'PKG_STAT.PROC_KILL_INACTIVE_SESSIONS;',
start_date => to_date('2016-01-02 18:00:00',
'yyyy-mm-dd hh24:mi:ss'),
repeat_interval => 'Freq=Monthly;Interval=1',
end_date => to_date(null),
job_class => 'DEFAULT_JOB_CLASS',
enabled => true,
auto_drop => false);

end;
/

猜你喜欢

转载自www.cnblogs.com/kingwei55555/p/12127906.html