From 2bc2282fc0013d9e5b38b05453d26feccb617614 Mon Sep 17 00:00:00 2001 From: Amos Feng Date: Thu, 30 Aug 2018 18:41:17 +0800 Subject: [PATCH 1/2] DBCP-520 update to pass the TransactionSynchronizationRegistry with creating the DataSourceXAConnectionFactory --- .../apache/commons/dbcp2/managed/BasicManagedDataSource.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java index 769fe5d5cd..723f41a8e0 100644 --- a/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java +++ b/src/main/java/org/apache/commons/dbcp2/managed/BasicManagedDataSource.java @@ -22,6 +22,7 @@ import org.apache.commons.dbcp2.PoolableConnection; import org.apache.commons.dbcp2.PoolableConnectionFactory; import org.apache.commons.dbcp2.PoolingDataSource; +import org.apache.commons.dbcp2.Utils; import javax.sql.DataSource; import javax.sql.XADataSource; @@ -63,7 +64,7 @@ public class BasicManagedDataSource extends BasicDataSource { /** XA data source instance */ private XADataSource xaDataSourceInstance; - /** Transaction Manager */ + /** Transaction Synchronization Registry */ private transient TransactionSynchronizationRegistry transactionSynchronizationRegistry; /** @@ -198,7 +199,7 @@ protected ConnectionFactory createConnectionFactory() throws SQLException { // finally, create the XAConnectionFactory using the XA data source final XAConnectionFactory xaConnectionFactory = new DataSourceXAConnectionFactory(getTransactionManager(), - xaDataSourceInstance, getUsername(), getPassword()); + xaDataSourceInstance, getUsername(), Utils.toCharArray(getPassword()), getTransactionSynchronizationRegistry()); transactionRegistry = xaConnectionFactory.getTransactionRegistry(); return xaConnectionFactory; } From 96b32fa6cb6545c25350d8c9c2442b60b3fd288b Mon Sep 17 00:00:00 2001 From: Amos Feng Date: Fri, 31 Aug 2018 15:40:33 +0800 Subject: [PATCH 2/2] update to add the unit test --- .../managed/TestBasicManagedDataSource.java | 67 ++++++++++++++++--- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java b/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java index 95dc4243c8..8293ef4ed5 100644 --- a/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java +++ b/src/test/java/org/apache/commons/dbcp2/managed/TestBasicManagedDataSource.java @@ -17,16 +17,8 @@ */ package org.apache.commons.dbcp2.managed; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; - -import java.sql.SQLException; - -import javax.sql.XADataSource; -import javax.transaction.xa.XAException; - +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple; +import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionSynchronizationRegistryImple; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.TestBasicDataSource; import org.apache.geronimo.transaction.manager.TransactionManagerImpl; @@ -34,6 +26,19 @@ import org.h2.jdbcx.JdbcDataSource; import org.junit.Test; +import javax.sql.XADataSource; +import javax.transaction.Synchronization; +import javax.transaction.TransactionManager; +import javax.transaction.TransactionSynchronizationRegistry; +import javax.transaction.xa.XAException; +import java.sql.Connection; +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; + /** * TestSuite for BasicManagedDataSource */ @@ -171,4 +176,46 @@ public void testSetNullXaDataSourceInstance() throws SQLException, XAException { assertNull(basicManagedDataSource.getXaDataSourceInstance()); } } + + @Test + public void testTransactionSynchronizationRegistry() throws Exception { + try (final BasicManagedDataSource basicManagedDataSource = new BasicManagedDataSource()) { + basicManagedDataSource.setTransactionManager(new TransactionManagerImple()); + TransactionSynchronizationRegistry tsr = new TransactionSynchronizationRegistryImple(); + basicManagedDataSource.setTransactionSynchronizationRegistry(tsr); + JdbcDataSource xaDataSource = new JdbcDataSource(); + xaDataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"); + basicManagedDataSource.setXaDataSourceInstance(xaDataSource); + basicManagedDataSource.setMaxIdle(1); + + TransactionManager tm = basicManagedDataSource.getTransactionManager(); + tm.begin(); + tsr.registerInterposedSynchronization(new Synchronization() { + @Override + public void beforeCompletion() { + Connection connection = null; + try { + connection = basicManagedDataSource.getConnection(); + assertNotNull(connection); + } catch (SQLException e) { + fail(e.getMessage()); + } finally { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + fail(e.getMessage()); + } + } + } + } + + @Override + public void afterCompletion(int i) { + + } + }); + tm.commit(); + } + } }