ORACLE数据库连接数满的分析及优化

最近在使用Oracle的过程中,出现了数据库连接数满的情况,导致程序及数据库连接工具连接不上。主要从两个方面来考虑这件事,从程序方面来看:

    1.进行数据库连接操作后未释放连接;

    2.若使用了数据库连接池,则考虑连接池的超时设置。

从数据库本身来看:

    1.可以增加数据库的最大连接数;

    2.可以定时清理数据库中INACTIVE的会话。

对于增加最大连接数的资料很多,文末也会推荐一个链接,定时清理INACTIVE会话需要创建一个存储过程找出超过2小时(根据需求设定)的会话,然后断开会话,具体如下:

--清理超过2小时的INACTIVE会话
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


  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值