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

  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/lcword/p/5859258.html
Copyright © 2011-2022 走看看