Repository: commons-dbcp Updated Branches: refs/heads/master c6fe04676 -> bc7a3969c
[DBCP-515] Do not try to register synchronization when the transaction is no longer active. Applied a different, more compact, version of the patch. The test is the same though. Closes #16. Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/bc7a3969 Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/bc7a3969 Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/bc7a3969 Branch: refs/heads/master Commit: bc7a3969c039f179d5a73c8aff19cfe19d511503 Parents: c6fe046 Author: Gary Gregory <ggreg...@apache.org> Authored: Wed Jul 25 17:12:03 2018 -0600 Committer: Gary Gregory <ggreg...@apache.org> Committed: Wed Jul 25 17:12:03 2018 -0600 ---------------------------------------------------------------------- src/changes/changes.xml | 3 ++ .../dbcp2/managed/TransactionContext.java | 6 +++ .../managed/TestManagedDataSourceInTx.java | 49 ++++++++++++++++---- 3 files changed, 49 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/bc7a3969/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8f1de55..4ca3102 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -67,6 +67,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="update" issue="DBCP-517" due-to="Gary Gregory"> Make defensive copies of char[] passwords. </action> + <action dev="ggregory" type="update" issue="DBCP-515" due-to="Tom Jenkinson, Gary Gregory"> + Do not try to register synchronization when the transaction is no longer active. + </action> </release> <release version="2.5.0" date="2018-07-15" description="This is a minor release, including bug fixes and enhancements."> <action dev="ggregory" type="update" issue="DBCP-505" due-to="Gary Gregory"> http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/bc7a3969/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java b/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java index 486ffcd..2af9365 100644 --- a/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java +++ b/src/main/java/org/apache/commons/dbcp2/managed/TransactionContext.java @@ -130,6 +130,12 @@ public class TransactionContext { */ public void addTransactionContextListener(final TransactionContextListener listener) throws SQLException { try { + if (!isActive()) { + Transaction transaction = this.transactionRef.get(); + listener.afterCompletion(TransactionContext.this, + transaction == null ? false : transaction.getStatus() == Status.STATUS_COMMITTED); + return; + } final Synchronization s = new Synchronization() { @Override public void beforeCompletion() { http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/bc7a3969/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java b/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java index a8d45a9..c3283ae 100644 --- a/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java +++ b/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java @@ -23,23 +23,24 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import org.apache.commons.dbcp2.DelegatingConnection; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - import java.sql.CallableStatement; import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.sql.ResultSet; -import java.sql.PreparedStatement; +import javax.transaction.Synchronization; import javax.transaction.Transaction; +import org.apache.commons.dbcp2.DelegatingConnection; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + /** - * TestSuite for ManagedDataSource with an active transaction in progress. + * Tests ManagedDataSource with an active transaction in progress. */ public class TestManagedDataSourceInTx extends TestManagedDataSource { @@ -98,6 +99,36 @@ public class TestManagedDataSourceInTx extends TestManagedDataSource { } } + @Test + public void testGetConnectionInAfterCompletion() throws Exception { + + final DelegatingConnection<?> connection = (DelegatingConnection<?>) newConnection(); + // Don't close so we can check it for warnings in afterCompletion + transactionManager.getTransaction().registerSynchronization(new Synchronization() { + @Override + public void beforeCompletion() { + // empty + } + + @Override + public void afterCompletion(int i) { + try { + Connection connection1 = ds.getConnection(); + try { + connection1.getWarnings(); + fail("Could operate on closed connection"); + } catch (SQLException e) { + // This is expected + } + } catch (SQLException e) { + fail("Should have been able to get connection"); + } + } + }); + connection.close(); + transactionManager.commit(); + } + @Override @Test public void testHashCode() throws Exception {