启动Tomcat时遇到了OracleTimeoutPollingThread错误
This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait<Native Method>
oracle.jdbc.driver.BlockSource
java.lang.Thread.sleep<Native Method>
oracle.jdbc.driver.OracleTimeoutPollingThread.run<OracleTimeoutPollingThread
该错误很有可能是Oracle的会话数已经满了。
查看一下程序所连接的数据库实例允许有多少个连接:
select value from v$parameter where name ='processes';
默认是150
查看当前有多少个会话连接着这个实例:
select count(*) from v$session;
如果发现允许的最大连接数是好几千,现在只连接了几百个,那么还有可能是总的数量很大,但是你所使用的这个用户被限制了最大连接数,比如给你限制了只允许100个。
如果你tomcat程序中连接oracle的用户名是WEBDEMO,可以看看你这个用户一共站了多少个session
select * from V$SESSION where username='WEBDEMO';
如果要kill掉某些会话,可以使用
alter system kill session '会话ID,序号';
会话ID,序号怎么查询呢?
例如下面的语句可以查询WEBDEMO这个用户的会话信息:
select sid,serial#,username,status from V$SESSION where username='WEBDEMO';
如果想批量删除oracle会话,你似乎没有太好的选择,下面是相对好用的方法,例如批量删除WEBDEMO用户的处于非活跃状态的会话步骤是:
1、执行语句:
SELECT 'alter system kill session ''' || T.sid || '' || ',' || t.serial# || ''';',
t.*
from v$session t
where username ='WEBDEMO' and status ='INACTIVE';
得到结果:
2、将每一行,第一列的内容(也就是红框里的内容)复制出来,当做命令执行,这样虽然不是真正意义上的批量,但是也是省了很多功夫。