[DBCP-512] Avoid exceptions when closing a connection in mutli-threaded use case. Update tests from org.apache.geronimo.modules:geronimo-transaction 1.2-beta to 2.2.1.
Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/ff640023 Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/ff640023 Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/ff640023 Branch: refs/heads/release Commit: ff6400238181b6d4ceda00c1eec79da6877bb171 Parents: 6afe06b Author: Gary Gregory <garydgreg...@gmail.com> Authored: Sun Jul 8 12:29:09 2018 -0600 Committer: Gary Gregory <garydgreg...@gmail.com> Committed: Sun Jul 8 12:29:09 2018 -0600 ---------------------------------------------------------------------- pom.xml | 13 +++++++------ src/changes/changes.xml | 3 +++ .../apache/commons/dbcp2/DelegatingConnection.java | 14 +++++++++++++- 3 files changed, 23 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/ff640023/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 5887a92..f1ec690 100644 --- a/pom.xml +++ b/pom.xml @@ -221,12 +221,7 @@ <dependency> <groupId>org.apache.geronimo.modules</groupId> <artifactId>geronimo-transaction</artifactId> - <!-- - Cannot update this currently; anything later causes failures: - java.lang.NoClassDefFoundError: - Could not initialize class org.apache.geronimo.transaction.manager.TransactionManagerImpl - --> - <version>1.2-beta</version> + <version>2.2.1</version> <scope>test</scope> <exclusions> <exclusion> @@ -240,6 +235,12 @@ </exclusions> </dependency> <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>1.7.25</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.197</version> http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/ff640023/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 0310a56..dbe133b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -85,6 +85,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="update" issue="DBCP-510" due-to="Gary Gregory"> Update Apache Commons Pool from 2.5.0 to 2.6.0. </action> + <action dev="ggregory" type="fix" issue="DBCP-512" due-to="Gary Gregory"> + Avoid exceptions when closing a connection in mutli-threaded use case. + </action> </release> <release version="2.4.0" date="2018-06-12" description="This is a minor release, including bug fixes and enhancements."> <action dev="ggregory" type="fix" issue="DBCP-484" due-to="Emanuel Freitas"> http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/ff640023/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java index 1356efa..d2ed073 100644 --- a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java +++ b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java @@ -224,8 +224,20 @@ public class DelegatingConnection<C extends Connection> extends AbandonedTrace i passivate(); } finally { if (connection != null) { + boolean connectionIsClosed; try { - connection.close(); + connectionIsClosed = connection.isClosed(); + } catch (SQLException e) { + // not sure what the state is, so assume the connection is open. + connectionIsClosed = false; + } + try { + // DBCP-512: Avoid exceptions when closing a connection in mutli-threaded use case. + // Avoid closing again, which should be a no-op, but some drivers like H2 throw an exception when + // closing from multiple threads. + if (!connectionIsClosed) { + connection.close(); + } } finally { closed = true; }