Uploaded image for project: 'Commons DBCP'
  1. Commons DBCP
  2. DBCP-65

[dbcp] Deadlock when evicting dbcp objects (testWhileIdle=true)

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.2.2
    • Labels:
      None
    • Environment:

      Operating System: All
      Platform: All

    • Bugzilla Id:
      34539

      Description

      The GenericKeyedObjectPool$Evictor thread has probability of deadlock with dbcp
      objects.

      For example, at a certain time, a normal user thread calls a PoolingConnection
      object's synchronized method, which in turn calls GenericKeyedObjectPool
      object's synchronzied method.

      At the same time, the evictor thread calls the GenericKeyedObjectPool object's
      synchronized method 'evict', which in turn calls the PoolingConnection object's
      synchronized method. When testWhileIdle=true, the probability of evictor
      calling GenericKeyedObjectPool's synchronized method is much greater.

      The following is the deadlock information in the thread dump of our program
      (testWhileIdle=true):

      "Thread-106":
      at org.apache.commons.dbcp.AbandonedTrace.removeTrace(AbandonedTrace.java:221)

      • waiting to lock <0x6a6b1b80> (a org.apache.commons.dbcp.PoolingConnection)
        at
        org.apache.commons.dbcp.PoolablePreparedStatement.passivate(PoolablePreparedStatement.java:100)
        at
        org.apache.commons.dbcp.PoolingConnection.passivateObject(PoolingConnection.java:239)
        at
        org.apache.commons.pool.impl.GenericKeyedObjectPool.evict(GenericKeyedObjectPool.java:1001)
      • locked <0x6a6b1858> (a org.apache.commons.pool.impl.GenericKeyedObjectPool)
        at
        org.apache.commons.pool.impl.GenericKeyedObjectPool$Evictor.run(GenericKeyedObjectPool.java:1156)
        at java.lang.Thread.run(Thread.java:534)
        "Thread-41":
        at
        org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:715)
      • waiting to lock <0x6a6b1858> (a
        org.apache.commons.pool.impl.GenericKeyedObjectPool)
        at
        org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:87)
      • locked <0x6a6b1b80> (a org.apache.commons.dbcp.PoolingConnection)
        at
        org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:185)
        at
        org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:278)
        ...

      This problem can be worked around by setting testWhileIdle to false, although
      there is still very small possibility of deadlock.

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                phnixwxz1@yahoo.com Wang Xianzhu
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: