Florent Guillaume created DBCP-569:
--------------------------------------
Summary: Fix test random failure on
TestSynchronizationOrder.testInterposedSynchronization
Key: DBCP-569
URL: https://issues.apache.org/jira/browse/DBCP-569
Project: Commons DBCP
Issue Type: Bug
Reporter: Florent Guillaume
{{TestSynchronizationOrder.testInterposedSynchronization}} may fail randomly
depending on GC behavior, because the test involves a {{Transaction}} object
held only be weak references, which may be cleared earlier that the test
expects:
{noformat}
java.sql.SQLException: Unable to enlist connection because the transaction has
been garbage collected
at
org.apache.commons.dbcp2.managed.TransactionContext.getTransaction(TransactionContext.java:186)
at
org.apache.commons.dbcp2.managed.TransactionContext.setSharedConnection(TransactionContext.java:105)
at
org.apache.commons.dbcp2.managed.ManagedConnection.updateTransactionStatus(ManagedConnection.java:310)
at
org.apache.commons.dbcp2.managed.ManagedConnection.<init>(ManagedConnection.java:89)
at
org.apache.commons.dbcp2.managed.ManagedDataSource.getConnection(ManagedDataSource.java:64)
at
org.apache.commons.dbcp2.managed.TestSynchronizationOrder.testInterposedSynchronization(TestSynchronizationOrder.java:118)
{noformat}
The {{TransactionContext.transactionRef}} and the
{{TransactionRegistry.caches}} are holding onto the {{Transaction}} (acquired
in {{TransactionRegistry.getActiveTransactionContext()}}) only using weak refs.
However in {{TestSynchronizationOrder}} the fake {{TransactionManager}} returns
a {{Transaction}} (that's an instance of an anonymous class) but nobody holds a
strong reference to that. The fake {{TransactionManager}} should create the
fake {{Transaction}} at {{begin()}} time, and hold onto it using a strong
reference until {{commit()}} time.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)