新功能上线后,数据库告警,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:后来终于修改了代码不再一直持有连接,用完就释放,下次用的时候再取,把连接数又继续大大降低了。

oracle数据库inactive状态session过多的原因定位相关推荐

  1. oracle数据库频繁被锁,Oracle数据库账号频繁被锁定的原因排查

    在Oracle数据库操作中,登录Oracle账号时提示失败,而且Oracle账号频繁被锁定.造成此故障的原因是什么呢?本文就介绍了这一过程,通过逐步排查我们就能找到该故障的原因了. 下面记录下查找这个 ...

  2. 查看oracle数据库启动状态,Oracle数据库的状态查询

    1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...

  3. 简述oracle数据库特殊状态,【OracleDB】 01 概述和基本操作

    实例概念: Oracle有一个特殊的概念 Oracle数据库 = 数据库 + Oracle文件系统 + Oracle实例 实例处理Oracle的请求,调用文件系统 然后返回结果响应给客户端 单实例和多 ...

  4. Oracle数据库的状态查询

    1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...

  5. oracle数据物理结构包括,Oracle数据库的物理结构介绍

    Oracle数据库现以发展最为抢手,那么你对它的实际应用以及相关功能特性了解的又有多少呢?以下的文章主要是向你介绍Oracel的初步认识,你如果是Oracle数据库的疯狂一族的话,以下的文章,你一定不 ...

  6. oracle数据库怎么分组查询,oracle数据库之分组查询

    本章内容和大家分享的是数据当中的分组查询.分组查询复杂一点的是建立在多张表的查询的基础之上,(我们在上一节课的学习中已经给大家分享了多表查询的使用技巧,大家可以自行访问:多表查询1  多表查询2)而在 ...

  7. Oracle数据库新增时---违反唯一约束条件

    问题 Oracle数据库新增时-违反唯一约束条件 原因 sequence冲突 解决 于数据库中,先进行sequence的自增 HTTP Status 500 – Internal Server Err ...

  8. Web项目--------原Oracle数据库的项目同时兼容MySql

    原Oracle数据库的项目同时兼容MySql步骤: (一)修改资源配置文件applicationContext-dataSource.xml的数据库连接 Oracle数据库中加上from dual的原 ...

  9. oracle 分组 排名,Oracle数据库之分组查询及排序

    分组查询:使用 group by 来设置分组,把该列具有相同值的多条记录当成一组记录来处理,然后只会输出一条记录,得到的结果会默认使用升序的方式进行排列. 规则: (1)如果使用了分组函数,或者是 g ...

最新文章

  1. Linux配置基础命令
  2. linux特殊权限位之setuid、setgid和sticky
  3. 【实践驱动开发2-001】wifi 在android 下的实现 - AR6000 系列移植详细步骤
  4. 基于selenium的爬虫
  5. UI设计学习软件下载的好去处
  6. CToolBarCtrl工具栏设置总结(转)
  7. sqlalchemy学习
  8. 分析一个在高并发下的财务支付锁的问题
  9. 854. 相似度为 K 的字符串(每日一难phase2--day20)
  10. eclipse如何装php插件,Eclipse PHP插件(PHPEclipse)安装与配置图解
  11. LABjs、RequireJS、SeaJS 哪个最好用?为什么?
  12. matlab仿真光学拍,MATLAB光学干涉实验的仿真研究
  13. 电子计算机第一台视频,1946年2月14日世界上第一台计算机诞生
  14. 特效行者app手机版制作飞天特效视频的教程
  15. Python对遥感影像重采样,以及重采样方法
  16. jquery-9 京东和酒仙网左侧导航如何实现
  17. 字符串--Leetcode (python)
  18. Java基础篇——面向对象编程
  19. 转售联通物联网卡的盈利可能性探讨
  20. 软件开发生命周期中的设计阶段_软件的生命周期——测试人员必须了解的事

热门文章

  1. 飞猪信息流内容推荐探索
  2. 【报告分享】新基建专题报告:5g和数据中心的投资机会分析.pdf(附下载链接)...
  3. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(5)——Leveraging other clues
  4. 速成pytorch学习——6天Dataset和DataLoader
  5. sklearn中的Linear_model的score函数讲解
  6. linux虚拟机怎么显示桌面,虚拟机中如何开启Linux的3d特效桌面?
  7. 一分钟带你打开TikTok直播的世界?
  8. 如何设置centos7的ip地址配置信息,让我的主机和它互Ping,以及远程登陆
  9. 2018年上半年读者最喜爱的异步新书TOP50
  10. Python2读取Excel文件时候文件名称是中文的时候处理