您的位置:首页 > 数据库 > Oracle

解决Oracle 11gR2 空闲连接过多,导致连接数满的问题

2016-09-10 13:41 447 查看
今天又遇到了11gR2连接数满的问题,以前也遇到过,因为应用那边没有深入检查,没有找到具体原因,暂且认为是这个版本Oracle的BUG吧。

上次的处理办法是用Shell脚本定时在系统中kill v$session.status='INACTIVE'的连接,但是这次现场没有在操作系统中部署脚本的权限,只好在数据库中做处理,幸好我们对这个 数据库有完全的权限。这次使用了profile+JOB定时alter system kill 'sid,seral#' immediate的方式。具体脚本如下:

CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 30;

SELECT * FROM dba_profiles WHERE PROFILE='KILLIDLE';

ALTER USER TEST_USER PROFILE KILLIDLE;

SELECT username,PROFILE FROM dba_users WHERE username='TEST_USER';

ALTER SYSTEM SET resource_limit=TRUE;

CREATE OR REPLACE PROCEDURE sp_kill_idlesession

/**********************************

清除idle超时的会话进程

**********************************/

AS

CURSOR c_kill_sqls

IS SELECT 'alter system kill session '''||s.sid||','||s.SERIAL#||''' immediate' sqlstr FROM v$session s WHERE s.STATUS='SNIPED';

BEGIN

FOR v_sql IN c_kill_sqls

LOOP

EXECUTE IMMEDIATE v_sql.sqlstr;

END LOOP;

END;

--添加JOB,定时清理过期会话

DECLARE jobnum NUMBER :=661;

BEGIN

dbms_job.submit(job => jobnum,

what => 'sp_kill_idlesession;',

next_date => to_date('30-04-2014 18:00:00', 'dd-mm-yyyy hh24:mi:ss'),

interval => 'SYSDATE + 1/144');

commit;

END;

--如果30分钟过期时间太短,对数据库访问性能产生了影响,可以调整

ALTER PROFILE KILLIDLE LIMIT IDLE_TIME 30;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: