oracle数据库inactive状态session过多的原因定位

新功能上线后,数据库告警,session连接接近最大值,有耗尽的风险。

开始定位解决这个风险问题,首先查看这些连接都在执行什么sql

select sql_text,se.* from v$sql s, v$session se 
where se.prev_hash_value=s.hash_value and se.status='INACTIVE'  and se.username ='ETL'

发现有接近2000个连接都在执行select 1 from dual;

到代码里搜索,发现这个是连接池创建连接后执行的一个sql用来测试连接可用。

难道连接没释放,又不太可能,因为连接数没有再继续增长了。本地把程序跑起来边操作边观察session连接数的情况:

-- 查看session信息
select prev_exec_start,LAST_CALL_ET sss,machine,port,process,status,program,type,username, sid, serial#, server, paddr from v$session where username ='ETL' and upper(machine) like '%-PC%'  order by sss desc;

-- 统计程序及所在主机的连接数
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;

发现运行流程后,连接会增加,增加到连接池最大连接就不再增加,一段时间后连接又会降低。

如果并行运行流程则流程不结束时连接不会释放,并能超过连接池最大连接数。最后发现连接不足时会创建连接,而连接不用会归还给连接池,连接不会立刻被关闭要达到最大空闲时间才会被连接池回收。我们的连接池回收的不及时导致有很大空闲连接没被关闭,所以只要修改连接池的回收频率就能减少空闲连接会话。

下面是我观察的记录:

运行流程后增加到7个session(不清楚客户端有没有增加连接)
运行两个增加到9个session
运行相同流程,session未增加。
客户端打开新流程 ,session未增加。客户端打开job不影响session?
运行新流程,session+1 到10个(sql节点的连接不走连接池,还没开始)
放开sql节点,session未增加还是10个,sql节点不影响?
新流程执行结束,session还是10个未回缩


创建等待流程测试,发现这段时间session回缩到7个了
运行等待新流程,session未增加;
运行相同等待流程,session未增加;
运行新等待流程,session +1   增加到8
运行新等待流程,session +1   增加到9
运行新等待流程,session +1   增加到10
运行新等待流程,session +1   增加到11 (超出最大连接限制?)
12
13
14
15
16
17
18
每运行一次增加一个session

发现是线程池设置的很小,每个流程是占用一个连接的,当并行流程数超过线程池最大数时,设置的策略是新建连接,而流程完成后会将连接归还给连接池,连接池不会立即回收连接而是定时检测并关闭超出最大空闲时间的连接。这个空闲时间是10分钟,比较长,可以设置小一些就会快一些回收空闲连接,减少总的连接数。

看网上还有说定时杀session的,修改数据库连接超时的,对于我这个程序都不够安全实用,还是设置连接池快速回收空闲的连接比较安全。

ps:后来终于修改了代码不再一直持有连接,用完就释放,下次用的时候再取,把连接数又继续大大降低了。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值