2016-09-06 68 views
0

一個JBoss 5.2應用服務器日誌充滿了千元以下異常:過程可達到MAX_UTILIZATION是否導致「無法獲得託管連接」異常?

Caused by: javax.resource.ResourceException: Unable to get managed connection for jdbc_TestDB 
at org.jboss.resource.connectionmanager.BaseConnectionManager2.getManagedConnection(BaseConnectionManager2.java:441) 
at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:424) 
at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:496) 
at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:941) 
at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:96) 
... 9 more 
Caused by: javax.resource.ResourceException: No ManagedConnections available within configured blocking timeout (30000 [ms]) 
at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.getConnection(InternalManagedConnectionPool.java:311) 
at org.jboss.resource.connectionmanager.JBossManagedConnectionPool$BasePool.getConnection(JBossManagedConnectionPool.java:689) 
at org.jboss.resource.connectionmanager.BaseConnectionManager2.getManagedConnection(BaseConnectionManager2.java:404) 
... 13 more 

我扒掉異常的第一部分,這基本上是其試圖獲取DB我們內部的JDBC包裝代碼來自池的連接。

望着Oracle數據庫端,我跑的查詢:

select resource_name, current_utilization, max_utilization, limit_value 
from v$resource_limit 
where resource_name in ('sessions', 'processes'); 

這產生的輸出:

RESOURCE_NAME CURRENT_UTILIZATION  MAX_UTILIZATION  LIMIT_VALUE 
processes  1387     1500    1500 
sessions  1434     1586    2272 

鑑於該進程的1500極限達到的事實,將這個引起我們遇到的JBoss異常?我也一直在調查連接泄漏的可能性,但到目前爲止還沒有找到任何證據。

這裏推薦的行動方案是什麼?簡單地增加限制一個有效的解決方案?

回答

0

哼怪。是否有可能,JBOSS中的異常封裝隱藏了原始錯誤?你應該得到一些sql例外,其文本以ORA-開頭。也許你的JDBC包裝不能正確處理錯誤。

建議的行動是:對processessessions甲骨文啓動paramters連接池的

  • 檢查配置的大小。
  • 檢查甲骨文查看v$session,尤其是列STATUSLAST_CALL_ETSQL_IDPREV_SQL_ID
  • 通過v $ sql將sql_id(prev_sql_id)轉換爲sql_text。
  • 如果您的應用程序存在連接泄漏,則sql_id和pred_sql_id可能會指向您源代碼中最後使用連接(即泄漏位置)的地方。
+0

謝謝,頂級異常是'異常插入到數據庫: org.jboss.util.NestedSQLException:無法獲得jdbc_TestDB的託管連接; - 嵌套的throwable:(javax.resource.ResourceException:無法獲得jdbc_TestDB的託管連接)',StackTrace中沒有提到'ORA-',我可以看到。 – ptha

+0

查看此答案:http://stackoverflow.com/a/27512651/836215。通常,Oracle Jdbc驅動程序會拋出以ORA- 開頭的異常。也許你的包裝會以某種方式丟棄這些信息,那麼調查就會更加困難。 – ibre5041

+0

我在代碼中看不到任何地方吞噬異常,所以也許jBoss正在這樣做,我不能控制它。這個問題可能是由於會話限制和進程限制不匹配的原因嗎?會話最大利用率1586大於進程限制1500,關係不是1:1,但是爲進程配置下限有意義嗎?不幸的是,我沒有直接訪問或控制發生這種情況的環境。 – ptha

0

通常當max_utilization得到過程值監聽器將拒絕新的數據庫連接。您可以在警報日誌中看到與它有關的錯誤。要在數據庫端解決這個問題,您應該增加進程參數。

相關問題