Repository: commons-dbcp Updated Branches: refs/heads/master c2efa4a80 -> af598460a
[DBCP-516] Do not double returnObject back to the pool if there is a transaction context with a shared connection. Closes #17. Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/af598460 Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/af598460 Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/af598460 Branch: refs/heads/master Commit: af598460ac9990c2a02823b3cfbdaf9f5429ad5e Parents: c2efa4a Author: Gary Gregory <ggreg...@apache.org> Authored: Wed Jul 25 17:27:54 2018 -0600 Committer: Gary Gregory <ggreg...@apache.org> Committed: Wed Jul 25 17:27:54 2018 -0600 ---------------------------------------------------------------------- src/changes/changes.xml | 3 ++ .../dbcp2/managed/ManagedConnection.java | 3 +- .../managed/TestManagedDataSourceInTx.java | 36 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/af598460/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4ca3102..422b308 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -70,6 +70,9 @@ The <action> type attribute can be add,update,fix,remove. <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> + <action dev="ggregory" type="update" issue="DBCP-516" due-to="Tom Jenkinson, Gary Gregory"> + Do not double returnObject back to the pool if there is a transaction context with a shared connection. + </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/af598460/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java b/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java index 1b1f9de..f9e7d1e 100644 --- a/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java +++ b/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java @@ -105,9 +105,10 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio // in the transaction, replace our delegate with the enrolled connection // return current connection to the pool + @SuppressWarnings("resource") final C connection = getDelegateInternal(); setDelegate(null); - if (connection != null) { + if (connection != null && transactionContext.getSharedConnection() != connection) { try { pool.returnObject(connection); } catch (final Exception ignored) { http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/af598460/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 0dbfe76..8090cc6 100644 --- a/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java +++ b/src/test/java/org/apache/commons/dbcp2/managed/TestManagedDataSourceInTx.java @@ -17,6 +17,7 @@ */ package org.apache.commons.dbcp2.managed; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; @@ -129,6 +130,41 @@ public class TestManagedDataSourceInTx extends TestManagedDataSource { transactionManager.commit(); } + @Test + public void testDoubleReturn() throws Exception { + transactionManager.getTransaction().registerSynchronization(new Synchronization() { + private ManagedConnection<?> conn; + + @Override + public void beforeCompletion() { + try { + conn = (ManagedConnection<?>) ds.getConnection(); + assertNotNull(conn); + } catch (final SQLException e) { + fail("Could not get connection"); + } + } + + @Override + public void afterCompletion(final int i) { + final int numActive = pool.getNumActive(); + try { + conn.checkOpen(); + } catch (final Exception e) { + // Ignore + } + assertEquals(numActive, pool.getNumActive()); + try { + conn.close(); + } catch (final Exception e) { + fail("Should have been able to close the connection"); + } + // TODO Requires DBCP-515 assertTrue(numActive -1 == pool.getNumActive()); + } + }); + transactionManager.commit(); + } + @Override @Test public void testHashCode() throws Exception {