解决oracle session超过系统设置数量

我负责的其中一个系统一直存在session越来越大最后会超过数据库设置最大值的问题。由于目前上线用户业务量不大。所以暂时没有危险。为了解决这个问题,我花了近三天的时间。今天终于找到问题所在,真是千里之堤溃于蚁穴啊。

由于系统采用了我写的一个责任链式的小框架,其中有事务开启和事务结束节点、循环节点等。所以并不像一般顺序代码那样直接检查代码就能排查出问题。这里我不是要讲怎么去看代码。而是怎么不用仔细过代码也能找出问题思路。

首先session过大,我初步判断是因为有数据库链接没关。但是因为我们的业务类采用的都是我写的节点模板,开连接和关连接都是模板负责的,所以又大概可判断应该不是业务代码的问题,而是我流程引擎或者基类除了问题。然后花了两天时间在代码里面各种打印session数量。为了监控我操作时的session数量还写了个0.5秒扫描一次session数量的工具。这些无用功就不在此赘言。

一开始我的思路是在节点之间打印session数量,看是哪个节点去开新session了。定位到节点之后狠命过代码,可是就是找不到没有关链接的地方。后来才发现我的思路是错的。我不应该找开新session的位置。因为这些地方是因为前面已经把连接池 的资源用没了才不得已开的新session。所以问题的根源应该是开新session的前面。但是前面定位就太大了。为了能定位精准点。我想了个办法。

系统取链接池管理连接,调用层级在深也逃不过连接池。于是我决定从链接池下手。我们系统连接池采用的是C3P0。于是我去官网下了C3P0的源码,把CombPoolDataSource 类的getConnection()方法改动下,加了行往数据库里插入了conntion的hashCode、和conntion的toString值的代码。然后把NewProxyConnection类的close()方法同样向数据库插入了这些信息。(插入动作我用的是JDBC,连接池还没起来,不可能从连接池去获取链接)。

表结构大致是

连接类型(0关 1开) 、connection的toString、 Connection的hashCode。如下图

131303_Ku27_1032172.png

系统每一步操作我都会用下面的sql查询一下未关的连接

select connobj,objhash from t_ta_sessionmonitor where conntype='1'
minus
select connobj,objhash from t_ta_sessionmonitor where conntype='0'

我前面说了,我已经在系统节点之间打印了session的toString。然后根据找出的未关闭的连接找到控制台打印出的session。于是就能定位到是哪个节点类没有关闭连接。剩下的就是仔细阅读代码,查出哪里没有关闭。

 

 

 

 

转载于:https://my.oschina.net/mlh3823/blog/680687

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值