通过给用户设置Profile来限制用户的IDLE_TIMESQL>Create profile 文件名 limit FAILED_LOGIN_ATTEMPTS:指定锁定用户的登录失败次数 PASSWORD_LOCK_TIME:指定用户被锁定天数 PASSWORD_LIFE_TIME:指定口令可用天数 PASSWORD_REUSE_TIME:指定在多长时间内口令不能重用 PASSWORD_REUSE_MAX:指定在重用口令前口令需要改变的次数 SESSIONS_PER_USER:限制用户并发会话个数 CPU_PER_SESSION:限制会话所占用的CPU时间(百分之一秒) CPU_PER_CALL:限制每次调用所占用的CPU时间(百分之一秒) CONNECT_TIME:限制会话的总计连接时间(分钟) IDLE_TIME:限制会话的空闲时间(分钟)); SQL>Create user 用户名 IDENTIFIED BY 口令 Default tablespace 表空间名 TEMPORARY tablespace 临时表空间名 Profile profile文件名 Quota 限制空间大小 on 表空间名;对已有用户则 SQL>ALTER USER 用户名 Profile profile文件名 ;
你的数据库是出于什么模式运行,是专用模式还是共享模式呢,如果是共享模式的话可能是你的会话数达到上限,执行命令查看show parameter process;再查看select county(*) from v$process; 比较一下这两个数值是否超过进程上限,如果要查看你的数据库是否出于共享模式还是专用模式可以执行如下语句select distinct server from v$session;如果值全是ditected 则为专用模式,如果有shared则为共享模式,共享模式经常会导致楼主这样的问题,导致会话数达到上限,资源部够用的情况
首先客户端的程序有问题,如果客户端不能解决,那只能通过存储过程定时kill掉了 CREATE OR REPLACE PROCEDURE "PROC_KILL_SESSION" AS v_sid number; v_serial number; killer varchar2(1000); CURSOR cursor_session_info is select sid,serial# from v$session where type!='BACKGROUND' and status='INACTIVE' and last_call_et>7200 and username='NETFORCE' and machine='imep1'; BEGIN open cursor_session_info; loop fetch cursor_session_info into v_sid,v_serial; exit when cursor_session_info%notfound; killer:='alter system disconnect session '''||v_sid||','||v_serial||''' post_transaction immediate'; -- killer:='alter system kill session '''||v_sid||','||v_serial||''' immediate'; execute immediate killer; end loop; dbms_output.PUT_LINE(cursor_session_info%rowcount||' users with idle_time>7200s have been killed!'); close cursor_session_info; END; / 再通过编写一个job进行 BEGIN DBMS_JOB.SUBMIT( job => job, what => 'kill_session;', next_date => SYSDATE, interval => 'sysdate + 120/1440'); --120minutescommit; END; /-
FAILED_LOGIN_ATTEMPTS:指定锁定用户的登录失败次数
PASSWORD_LOCK_TIME:指定用户被锁定天数
PASSWORD_LIFE_TIME:指定口令可用天数
PASSWORD_REUSE_TIME:指定在多长时间内口令不能重用
PASSWORD_REUSE_MAX:指定在重用口令前口令需要改变的次数
SESSIONS_PER_USER:限制用户并发会话个数
CPU_PER_SESSION:限制会话所占用的CPU时间(百分之一秒)
CPU_PER_CALL:限制每次调用所占用的CPU时间(百分之一秒)
CONNECT_TIME:限制会话的总计连接时间(分钟)
IDLE_TIME:限制会话的空闲时间(分钟)); SQL>Create user 用户名
IDENTIFIED BY 口令
Default tablespace 表空间名
TEMPORARY tablespace 临时表空间名
Profile profile文件名
Quota 限制空间大小 on 表空间名;对已有用户则
SQL>ALTER USER 用户名 Profile profile文件名 ;
比较一下这两个数值是否超过进程上限,如果要查看你的数据库是否出于共享模式还是专用模式可以执行如下语句select distinct server from v$session;如果值全是ditected 则为专用模式,如果有shared则为共享模式,共享模式经常会导致楼主这样的问题,导致会话数达到上限,资源部够用的情况
Oracle Session
Oracle Profile 使用详解
connect_time也不现实
oracle官方说session会自动清除,但也不知什么时候什么条件下自动清除
不行的话,就手动kill session吧!
CREATE OR REPLACE PROCEDURE "PROC_KILL_SESSION" AS v_sid number; v_serial number; killer varchar2(1000); CURSOR cursor_session_info is select sid,serial# from v$session where type!='BACKGROUND' and status='INACTIVE' and last_call_et>7200 and username='NETFORCE' and machine='imep1'; BEGIN open cursor_session_info; loop fetch cursor_session_info into v_sid,v_serial; exit when cursor_session_info%notfound;
killer:='alter system disconnect session '''||v_sid||','||v_serial||''' post_transaction immediate'; -- killer:='alter system kill session '''||v_sid||','||v_serial||''' immediate'; execute immediate killer; end loop; dbms_output.PUT_LINE(cursor_session_info%rowcount||' users with idle_time>7200s have been killed!'); close cursor_session_info; END; /
再通过编写一个job进行
BEGIN DBMS_JOB.SUBMIT( job => job, what => 'kill_session;', next_date => SYSDATE, interval => 'sysdate + 120/1440'); --120minutescommit; END; /-