We are using TOPLink 2.5.1.8 with Oracle 8i JDBC Thin Driver in our application server.

There are multiple threads of execution and in one particular scenario we are seeing a deadlock in the Oracle's JDBC driver.

Here are the stack traces of the 3 threads which are deadlocked:

Thread-15:
[1] oracle.jdbc.driver.OracleStatement.doExecuteQuery (OracleStatement.java:1558), pc = 241
[2] oracle.jdbc.driver.OracleStatement.doExecute (OracleStatement.java:1758), pc = 28
[3] oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1805), pc = 91
[4] oracle.jdbc.driver.OraclePreparedStatement.executeUpdate (OraclePreparedStatement.java:320), pc = 55
[5] oracle.jdbc.driver.OraclePreparedStatement.executeQuery (OraclePreparedStatement.java:278), pc = 24
[6] TOPLink.Private.DatabaseAccess.DatabaseAccessor.n (), pc = 8
[7] TOPLink.Private.DatabaseAccess.DatabaseAccessor.executeCall (), pc = 294
[8] TOPLink.Public.ThreeTier.ServerSession.executeCall (ServerSession.java:321), pc = 34
[9] TOPLink.Private.QueryFramework.CallQueryMechanism.executeCall (CallQueryMechanism.java:125), pc = 45
[10] TOPLink.Private.QueryFramework.CallQueryMechanism.executeCall (CallQueryMechanism.java:113), pc = 5
[11] TOPLink.Private.QueryFramework.CallQueryMechanism.selectOneRow (CallQueryMechanism.java:549), pc = 55
[12] TOPLink.Private.QueryFramework.ExpressionQueryMechanism.selectOneRowFromTable (ExpressionQueryMechanism.java:705), pc = 1
[13] TOPLink.Private.QueryFramework.ExpressionQueryMechanism.selectOneRow (ExpressionQueryMechanism.java:676), pc = 42
[14] TOPLink.Public.QueryFramework.ReadObjectQuery.execute (ReadObjectQuery.java:272), pc = 26
[15] TOPLink.Public.QueryFramework.DatabaseQuery.execute (DatabaseQuery.java:363), pc = 103
[16] TOPLink.Public.QueryFramework.ReadQuery.execute (ReadQuery.java:95), pc = 32
[17] TOPLink.Public.PublicInterface.Session.internalExecuteQuery (Session.java:1377), pc = 3
[18] TOPLink.Public.ThreeTier.ServerSession.internalExecuteQuery (ServerSession.java:441), pc = 15
[19] TOPLink.Public.SessionBroker.SessionBroker.internalExecuteQuery (SessionBroker.java:323), pc = 42
[20] TOPLink.Public.PublicInterface.Session.executeQuery (Session.java:847), pc = 80
[21] TOPLink.Public.PublicInterface.Session.executeQuery (Session.java:834), pc = 34
[22] TOPLink.Private.Indirection.QueryBasedValueHolder.instantiate (QueryBasedValueHolder.java:45), pc = 12
[23] TOPLink.Private.Indirection.DatabaseValueHolder.getValue (DatabaseValueHolder.java:62), pc = 9
[24] TOPLink.Private.Indirection.UnitOfWorkQueryValueHolder.getValueFromWrappedValueHolder (UnitOfWorkQueryValueHolder.java:59), pc = 38
[25] TOPLink.Private.Indirection.UnitOfWorkValueHolder.instantiate (UnitOfWorkValueHolder.java:119), pc = 16
[26] TOPLink.Private.Indirection.DatabaseValueHolder.getValue (DatabaseValueHolder.java:62), pc = 9


Thread-16:
[1] oracle.jdbc.driver.OracleStatement.getObjectValue (OracleStatement.java:3747), pc = 7
[2] oracle.jdbc.driver.OracleResultSetImpl.getObject (OracleResultSetImpl.java:381), pc = 6
[3] TOPLink.Private.DatabaseAccess.DatabaseAccessor.a (), pc = 213
[4] TOPLink.Private.DatabaseAccess.DatabaseAccessor.g (), pc = 39
[5] TOPLink.Private.DatabaseAccess.DatabaseAccessor.executeCall (), pc = 429
[6] TOPLink.Public.ThreeTier.ServerSession.executeCall (ServerSession.java:321), pc = 34
[7] TOPLink.Private.QueryFramework.CallQueryMechanism.executeCall (CallQueryMechanism.java:125), pc = 45
[8] TOPLink.Private.QueryFramework.CallQueryMechanism.executeCall (CallQueryMechanism.java:113), pc = 5
[9] TOPLink.Private.QueryFramework.CallQueryMechanism.executeSelectCall (CallQueryMechanism.java:187), pc = 60
[10] TOPLink.Private.QueryFramework.CallQueryMechanism.selectAllRows (CallQueryMechanism.java:528), pc = 1
[11] TOPLink.Private.QueryFramework.ExpressionQueryMechanism.selectAllRowsFromConcreteTable (ExpressionQueryMechanism.java:652), pc = 13
[12] TOPLink.Public.PublicInterface.InheritancePolicy.selectAllRowUsingDefaultMultipleTableSubclassRead (InheritancePolicy.java:874), pc
[13] TOPLink.Public.PublicInterface.InheritancePolicy.selectAllRowUsingMultipleTableSubclassRead (InheritancePolicy.java:896), pc = 28
[14] TOPLink.Private.QueryFramework.ExpressionQueryMechanism.selectAllRows (ExpressionQueryMechanism.java:634), pc = 37
[15] TOPLink.Public.QueryFramework.ReadAllQuery.execute (ReadAllQuery.java:271), pc = 44
[16] TOPLink.Public.QueryFramework.DatabaseQuery.execute (DatabaseQuery.java:363), pc = 103
[17] TOPLink.Public.QueryFramework.ReadQuery.execute (ReadQuery.java:95), pc = 32
[18] TOPLink.Public.PublicInterface.Session.internalExecuteQuery (Session.java:1377), pc = 3
[19] TOPLink.Public.ThreeTier.ServerSession.internalExecuteQuery (ServerSession.java:441), pc = 15
[20] TOPLink.Public.SessionBroker.SessionBroker.internalExecuteQuery (SessionBroker.java:323), pc = 42
[21] TOPLink.Public.PublicInterface.Session.executeQuery (Session.java:847), pc = 80
[22] TOPLink.Public.PublicInterface.Session.executeQuery (Session.java:834), pc = 34
[23] TOPLink.Private.Indirection.QueryBasedValueHolder.instantiate (QueryBasedValueHolder.java:45), pc = 12
[24] TOPLink.Private.Indirection.DatabaseValueHolder.getValue (DatabaseValueHolder.java:62), pc = 9
[25] TOPLink.Private.Indirection.UnitOfWorkQueryValueHolder.getValueFromWrappedValueHolder (UnitOfWorkQueryValueHolder.java:59), pc = 38
[26] TOPLink.Private.Indirection.UnitOfWorkValueHolder.instantiate (UnitOfWorkValueHolder.java:119), pc = 16
[27] TOPLink.Private.Indirection.DatabaseValueHolder.getValue (DatabaseValueHolder.java:62), pc = 9
[28] TOPLink.Public.Indirection.IndirectList.buildDelegate (IndirectList.java:158), pc = 4
[29] TOPLink.Public.Indirection.IndirectList.getDelegate (IndirectList.java:282), pc = 9
[30] TOPLink.Public.Indirection.IndirectList.size (IndirectList.java:521), pc = 1

Thread-17:
[1] oracle.jdbc.driver.OracleConnection.commit (OracleConnection.java:474), pc = 73
[2] TOPLink.Private.DatabaseAccess.DatabaseAccessor.commitTransaction (), pc = 76
[3] TOPLink.Public.PublicInterface.Session.basicCommitTransaction (Session.java:274), pc = 29
[4] TOPLink.Public.ThreeTier.ClientSession.basicCommitTransaction (ClientSession.java:84), pc = 1
[5] TOPLink.Public.PublicInterface.Session.commitTransaction (Session.java:397), pc = 18
[6] TOPLink.Public.SessionBroker.SessionBroker.basicCommitTransaction (SessionBroker.java:127), pc = 63
[7] TOPLink.Public.PublicInterface.Session.commitTransaction (Session.java:397), pc = 18
[8] TOPLink.Public.PublicInterface.UnitOfWork.commitTransaction (UnitOfWork.java:673), pc = 4
[9] TOPLink.Public.PublicInterface.UnitOfWork.commitToDatabase (UnitOfWork.java:648), pc = 189
[10] TOPLink.Public.PublicInterface.UnitOfWork.commitRootUnitOfWork (UnitOfWork.java:595), pc = 1
[11] TOPLink.Public.PublicInterface.UnitOfWork.commitAndResumeOnFailure (UnitOfWork.java:537), pc = 71


The threads have the following Java Object locks:

Monitor information for thread Thread-15:
Owned monitor: instance of oracle.jdbc.driver.OraclePreparedStatement(id=771)
Owned monitor: instance of TOPLink.Private.Indirection.UnitOfWorkQueryValueHolder(id=779)
Owned monitor: instance of TOPLink.Private.Indirection.QueryBasedValueHolder(id=781)
Waiting for monitor: instance of oracle.jdbc.driver.OracleConnection(id=769)

Monitor information for thread Thread-16:
Owned monitor: instance of TOPLink.Public.Indirection.IndirectList(id=772)
Owned monitor: instance of TOPLink.Private.Indirection.UnitOfWorkQueryValueHolder(id=773)
Owned monitor: instance of TOPLink.Private.Indirection.QueryBasedValueHolder(id=775)
Owned monitor: instance of oracle.jdbc.driver.OracleResultSetImpl(id=776)
Waiting for monitor: instance of oracle.jdbc.driver.OracleConnection(id=769)

Monitor information for thread Thread-17:
Owned monitor: instance of oracle.jdbc.driver.OracleConnection(id=769)
Waiting for monitor: instance of oracle.jdbc.driver.OraclePreparedStatement(id=771)


From these locks, you can see that Thread-15 has grabbed the lock for the OraclePreparedStatment with id 771 and is waiting on the lock for OracleConnection with id 769. However, Thread-17 has the lock for that OracleConnection with 769 and is waiting on the lock for the OraclePreparedStatement with 771.

This is a classic deadlock situation. How can this occur and is there a fix or workaround to this problem?