ORACLE数据库连接数满的分析及优化
转载自:https://blog.csdn.net/w864518106/article/details/80453473
最近在使用Oracle的过程中,出现了数据库连接数满的情况,导致程序及数据库连接工具连接不上。主要从两个方面来考虑这件事,从程序方面来看:
1.进行数据库连接操作后未释放连接;
2.若使用了数据库连接池,则考虑连接池的超时设置。
从数据库本身来看:
1.可以增加数据库的最大连接数;
2.可以定时清理数据库中INACTIVE的会话。
查看Oracle连接数:
select b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE , b.PROGRAM order by count(*) desc;
对于增加最大连接数的资料很多,文末也会推荐一个链接,定时清理INACTIVE会话需要创建一个存储过程找出超过2小时(根据需求设定)的会话,然后断开会话,具体如下
CREATE OR REPLACE PROCEDURE DB_KILL_IDLE_CLIENTS AUTHID DEFINER AS job_no number; num_of_kills number := 0; BEGIN FOR REC IN (SELECT SID, SERIAL#, INST_ID, MODULE, STATUS FROM gv$session S WHERE S.USERNAME IS NOT NULL AND S.LAST_CALL_ET >= 2 * 60 * 60 AND S.STATUS = 'INACTIVE' ORDER BY INST_ID ASC) LOOP DBMS_OUTPUT.PUT('LOCAL SID ' || rec.sid || '(' || rec.module || ')'); execute immediate 'alter system disconnect session ''' || rec.sid || ', ' || rec.serial# || '''immediate'; DBMS_OUTPUT.PUT_LINE('. killed locally ' || job_no); num_of_kills := num_of_kills + 1; END LOOP; DBMS_OUTPUT.PUT_LINE('Number of killed system sessions: ' || num_of_kills); END DB_KILL_IDLE_CLIENTS;
创建定时任务执行这个存储过程:
begin sys.dbms_job.submit(job => :job, what => 'SYS.DB_KILL_IDLE_CLIENTS;', next_date => to_date('25-05-2018 17:00:00', 'dd-mm-yyyy hh24:mi:ss'), interval => 'TRUNC(sysdate,''hh'') + 1/(24)'); commit; end;
注意以sys角色登录操作。
以下是参考的资料:
1.增加连接数:https://blog.csdn.net/lele2426/article/details/4978283
2.清理会话:https://www.cnblogs.com/kerrycode/p/3636992.html
3.创建定时任务:https://www.cnblogs.com/yx007/p/6519544.html