ManagedDataSource returns uses the same underlying DB connection across JTA tx
------------------------------------------------------------------------------

                 Key: DBCP-378
                 URL: https://issues.apache.org/jira/browse/DBCP-378
             Project: Commons Dbcp
          Issue Type: Bug
    Affects Versions: 1.4
            Reporter: Ortwin Glück
            Priority: Critical


It seems that when more than one JTA transaction is used within the same thread 
(suspend/resume transaction), the ManagedDataSource always uses the same 
underlying DB connection. This scenario is common in EJB containers! If the 
same DB connection is used the JTA suspend/resume actions have no effect. The 
JTA semantics is violated this behaviour.

Use the following code to setup a unit test that works in your environment

// DS setup
            XADataSource ods = new oracle.jdbc.xa.client.OracleXADataSource();
            ...
            TransactionManager tm = ...

            DataSourceXAConnectionFactory cf = new 
DataSourceXAConnectionFactory(tm, ods);
            
            AbandonedConfig ab = new AbandonedConfig();
            ab.setLogAbandoned(false);
            ab.setRemoveAbandoned(true);
            ab.setRemoveAbandonedTimeout(15*60);
            
            connPool = new GenericObjectPool(null);
            
            // registers itself on the pool
            KeyedObjectPoolFactory stmtPool = = new 
StackKeyedObjectPoolFactory(5);

            new PoolableManagedConnectionFactory(cf, connPool, stmtPool, 
                                          null, 5, 
                                          (Collection<String>) null, // init 
sql 
                                          false, // read-only 
                                          false, // auto-commit
                                          Connection.TRANSACTION_READ_COMMITTED,
                                          (String) null, // catalog
                                          ab);
            ds = new ManagedDataSource(connPool, cf.getTransactionRegistry());


// Unit test
        tm.begin();
        Connection c1 = source.getConnection();
        Connection ic1 = ((ManagedConnection) c1).getInnermostDelegate(); 
        c1.close();
        
        Transaction tx = tm.suspend();
        tm.begin();
        c2 = source.getConnection();
        ic2 = ((ManagedConnection) c2).getInnermostDelegate();
        c2.close();
        
        assertNotSame("Pool must NOT use identical connection across tx", ic1, 
ic2);
        tm.commit();
        tm.resume(tx);
        tm.commit();

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to