一、扩大oracle最大session数以及清除inactive会话。 kill
没有被回收的session
二、如果经常出现不够用。应从数据库连接池与程序bug
解决,比如jdbc连接不关闭,多次实例化spring中ClassPathXmlApplicationContext
等程序问题。
1、查询数据库当前进程的连接数:
select
count(*) from v$process;
2、查看数据库当前会话的连接数:
select
count(*) from v$session;
3、查看数据库的并发连接数:
select
count(*) from v$session where status='ACTIVE';
4、查看当前数据库建立的会话情况:
select
sid,serial#,username,program,machine,status from
v$session;
5、查询数据库允许的最大连接数:
select
value from v$parameter where name = 'processes';
6、查询oracle版本
select * from v$instance
7、查询是否有死锁
select *
from v$locked_object;
会话的状态:
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。
程序的问题逐一分析程序中是否有jdbc没有释放的,连接池等。