產生問題的原因是:會話連接數過多,需要kill掉,釋放無用連接
步驟:
1. 查看當前總會話數和進程數,這兩個視圖就是跟會話及進程有關的重要視圖啦,信息都是從這里面取的。
1) select count(*) from v$session;
2) 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 saddr,sid,serial#,paddr,username,status from v$session where username is not null;
alter system kill session 'sid,serial#';
被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.
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。