weblogic服务器中的连接池问题

时间:2018-01-12 10:26:56

标签: java weblogic thread-dump

您在分析线程转储时, 在服务器日志中,我可以看到如下的多个问题

Error due to access to database: 

Caused by: weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException: No resources currently available in pool NetCrackerDataSource to allocate to applications, please increase the size of the pool and retry..

如果我看到线程转储多个线程(大约90个)正在对象weblogic.jdbc.common.internal.GenericConnectionPool上休眠。

"[MF]XPaxhItetorMde(4)" daemon prio=10 tid=0x00007f38880cf800 nid=0x3805 in Object.wait() [0x00007f381c846000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x000000070271c090> (a weblogic.jdbc.common.internal.GenericConnectionPool)
    at weblogic.common.resourcepool.ResourcePoolImpl.reserveResourceInternal(ResourcePoolImpl.java:567)
    - locked <0x000000070271c090> (a weblogic.jdbc.common.internal.GenericConnectionPool)
    at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:353)
    at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:471)
    at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:363)
    at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:125)
    at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:77)

有人可以在这里帮助了解可能出现的问题,或者如何取得进展的方向吗?

更新:这是因为池中的连接完全使用而未释放。我怎么知道哪些进程阻止连接?对此有何帮助?

提前多多感谢!

2 个答案:

答案 0 :(得分:0)

将inactive-connection-timeout设置为合理的值(默认情况下为0)。此值取决于您的环境以及等待n秒直到尝试将连接返回到池的目标。

当应用程序将保持比inactive-connection-timeout参数更长的连接时,WebLogic将抛出警告和堆栈跟踪

答案 1 :(得分:0)

确实,weblogic.common.resourcepool.ResourcePoolImpl.releaseResource 方法是同步的,这意味着一次将执行一个线程。

这部分代码被调用,不仅在尝试获取数据库连接时,而且在尝试关闭连接时。在我们的情况下,我们看到 21 个线程试图关闭它们的连接并努力获得锁。

示例:

"[ACTIVE] ExecuteThread: '37' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=10 tid=--edited-- nid=--edited-- waiting for monitor entry [--edited--]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at weblogic.common.resourcepool.ResourcePoolImpl.releaseResource(ResourcePoolImpl.java:651)
    - waiting to lock <0x0000000702dff4f0> (a weblogic.jdbc.common.internal.GenericConnectionPool)
    at weblogic.jdbc.common.internal.ConnectionPool.release(ConnectionPool.java:780)
    at weblogic.jdbc.common.internal.ConnectionPoolManager.release(ConnectionPoolManager.java:177)
    at weblogic.jdbc.wrapper.PoolConnection.doClose(PoolConnection.java:226)
    at weblogic.jdbc.wrapper.PoolConnection.close(PoolConnection.java:139)
...

一份 Oracle 说明描述了一个类似的情况,提出了一个潜在的解决方案:

<块引用>

可以通过以下步骤解决此问题:

  1. 将 JDBC 驱动程序参数 SQLNET.EXPIRE_TIME 设置为一个较低的值(假设为 1 分钟)。更多细节请参考注释151972.1

  2. 为数据源启用“保留测试连接”。