zoukankan      html  css  js  c++  java
  • Oracle连接数过多释放机制

    Oracle连接数过多释放机制

     sqlplus /nolog 
     打开sqlplus  
      
      
     connect /as sysdba  
     使用具有dba权限得用户登陆oracle  
       
      
     show parameter resource_limit 
     显示资源限定是否开启,value为true是开启,为false是关闭  
     
     alter system set resource_limit=true 
     如果未开启,则使用此命令开启资源限定功能  
      
       
     create profile profileName limit connect_time 60 idle_time 30 
     创建profile文件,profileName任意起,connect_time设置连接超过多少分钟后强制释放,idle_time设置连续不活动的会话超过多少分钟后强制释放  
     
     alter user oracleUser profile profileName 
     将profile文件作用于指定用户 

     

     

    从上周起,服务器Oracle数据库出现问题,用不到半天,就会报maxsession(150)的问题,肯定是数据库的会话超过最大数了。

      由于服务器跑的是文件传输应用,占用的请求和会话肯定很大,因此用户数不大就已经让oracle的会话数达到最大值。

      处理方式不外乎两种:扩大oracle最大session数以及清除inactive会话,当然还有,就是从数据库连接池和程序bug上面下手。

    从各处收集了一些查看当前会话的语句,记录一下:

     

    1.select count(*) from v$session;

      select count(*) from v$process;

      查看当前总会话数和进程数,这两个视图就是跟会话及进程有关的重要视图啦,信息都是从这里面取的。

     

    2.查询那些应用的连接数此时是多少

    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;

     

    3.查询是否有死锁

    select * from v$locked_object;

     

    如果查询结果为no rows selected,说明数据库中没有死锁。否则说明数据库中存在死锁。

    接下来说明一下会话的状态:

     

    1.active 处于此状态的会话,表示正在执行,处于活动状态。

     

    2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下 的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;

     

    3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。我一开始以为,只要是inactive状态的会话,就是该杀,为什么不释放呢。其 实,inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在 oracle中直接设置超时时间,也是有两种方法,区别暂时还不清楚:

     

    1.修改sqlnet.ora文件,新增expire_time=x(单位是分钟)  

    我的sqlnet.ora位置在D:/oracle/ora92/network/admin

    2.通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。

     

    修改ORACLE 中的SESSION和PROCESS

    会话sessions和进程pocesses的关系
    一个process可以有0个、1个或者多个session,一个session也可以存在若干个process中,并行同样是一个session对应一 个process,主session是coordinator session,每个parallel process同样会对应数据库里一个单独的session。可以从v$px_session和v$session中验证这点。
    连接connects,会话sessions和进程pocesses的关系

    每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。

    Oracle的sessions和processes的数量关系是:sessions=1.1 * processes + 5

    下面我们用两种方法修改PROCESS的最大值
    一、通过Oracle Enterprise Manager Console在图形化管理器中修改
    以系统管理员的身份登入,进入界面 数据库的例程 - 配置 - 一般信息 - 所有初始化参数,修改processes的值

    二、在SQLPLUS中修改
    以DBA权限登录,修改PROCESS的值(SESSION的值会跟着改);创建pfile;重新启动数据库。输入的SQL命令如下,回显信息省略了
    SQL> connect sys/sys as sysdba
    SQL> alter system set processes=400 scope = spfile;
    SQL> create pfile from spfile;
    SQL> shutdown immediate;
    SQL> startup

  • 相关阅读:
    土豆网自动播放代码
    js倒计时小插件(兼容大部分浏览器)
    带按钮的网页播放器代码(附文件)
    列出目录下所有文件
    day19 进度条 & 随机验证码
    day18 json与pickle
    day14.2_三元表达式、列表生成式
    day14.1_生成器
    day13_迭代器
    day12.2_完善装饰器
  • 原文地址:https://www.cnblogs.com/lcword/p/5859258.html
Copyright © 2011-2022 走看看