可以达到进程的MAX_UTILIZATION原因"无法获得托管连接"例外?

时间:2016-09-06 10:26:58

标签: oracle jboss connection-pooling

JBoss 5.2应用程序服务器日志中充满了数千个以下异常:

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

我已经剥离了异常的第一部分,这基本上是我们的内部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的PROCESSES限制,这是否会导致我们遇到的JBoss异常?我也一直在调查连接泄漏的可能性,但到目前为止还没有找到任何证据。

这里推荐的行动方案是什么?只是增加限制是一个有效的解决方案吗?

2 个答案:

答案 0 :(得分:0)

嗯奇怪。是否有可能,JBOSS中的异常包装隐藏了原始错误?你应该得到一些sql异常,其文本以ORA-开头。也许你的JDBC包装器不能正确处理错误。

建议的行动是:

  • 针对processes sessions Oracle启动参数检查连接池的配置大小。
  • 检查Oracles视图v$session,尤其是列STATUSLAST_CALL_ETSQL_IDPREV_SQL_ID
  • 通过v $ sql将sql_id(prev_sql_id)翻译成sql_text。
  • 如果您的应用程序有连接泄漏,sql_id和pred_sql_id可能会指向您的源代码中的一个位置,其中最后使用了一个连接(即它被泄露的位置)。

答案 1 :(得分:0)

通常当 max_utilization 获取进程值时,侦听器将拒绝与数据库的新连接。您可以在警报日志中看到与其相关的错误。要在数据库端解决此问题,您应该增加进程参数。