DBCP连接池变空后阻塞的线程

时间:2018-03-07 10:37:20

标签: java oracle connection-pooling spring-jdbc apache-commons-dbcp

我有一个用DBCP连接池初始化的Spring JdbcTemplate对象。由于他们无法从DBCP池中获取连接,所以应用程序时不时都会响应,因为它们现在已经挂起,并且它们永远保持这种状态。只有重新启动应用程序才能解决问题。

java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <46251453> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at java.lang.Object.wait(Object.java:502)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1118)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:630)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:805)

查看堆转储显示池没有对象,即 (PoolingDataSource)的数据源。(GenericPoolObject)_pool。(CursorableLinkedList)_pool。(INT)_size == 0

this     - value: org.apache.commons.dbcp.BasicDataSource #2
 -> dataSource     - class: org.apache.commons.dbcp.BasicDataSource, value: org.apache.commons.dbcp.PoolingDataSource #1
  -> _pool     - class: org.apache.commons.dbcp.PoolingDataSource, value: org.apache.commons.pool.impl.GenericObjectPool #1
   -> _pool     - class: org.apache.commons.pool.impl.GenericObjectPool, value: org.apache.commons.pool.impl.CursorableLinkedList #1
    -> _size     - class: org.apache.commons.pool.impl.CursorableLinkedList, value: int 0

在空闲指定的阈值(10分钟)之后,似乎汇集的连接被逐出,然后没有创建新的连接。

  • 所有这些线程都试图对不同的表执行不同的操作,因此表锁定不太可能。
  • 我已经验证了(Oracle)数据库状态,以查看是否有任何活动会话等待提交:没有。
  • 此时使用相同数据库的其他应用程序实例也不会受到影响。
  • 我也排除了任何网络问题。数据库是可以访问的,我可以使用我们的Sql客户端
  • 进行连接

任何线索?

更新

我启用了DBCP放弃连接日志记录,超时约为20分钟。有许多被遗弃的连接。但是,由于连接创建和发布是通过Spring JDBCTemplate进行的,因此我无法明确地进行任何连接处理。我仍在努力解决这个难题。

0 个答案:

没有答案