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

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.2.2
    • None
    • Operating System: All
      Platform: All

    • 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

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

              Dates

                Created:
                Updated:
                Resolved: