Tomcat遇到OracleTimeoutPollingThread錯誤

陳南志發表於2016-09-12

    啟動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、將每一行,第一列的內容(也就是紅框裡的內容)複製出來,當做命令執行,這樣雖然不是真正意義上的批量,但是也是省了很多功夫。

           

        

        

相關文章