您在分析线程转储时, 在服务器日志中,我可以看到如下的多个问题
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)
有人可以在这里帮助了解可能出现的问题,或者如何取得进展的方向吗?
更新:这是因为池中的连接完全使用而未释放。我怎么知道哪些进程阻止连接?对此有何帮助?
提前多多感谢!
答案 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 说明描述了一个类似的情况,提出了一个潜在的解决方案:
<块引用>可以通过以下步骤解决此问题:
将 JDBC 驱动程序参数 SQLNET.EXPIRE_TIME 设置为一个较低的值(假设为 1 分钟)。更多细节请参考注释151972.1
为数据源启用“保留测试连接”。