You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2018/05/21 14:43:56 UTC

commons-dbcp git commit: [DBCP-484] Connection leak during XATransaction in high load.

Repository: commons-dbcp
Updated Branches:
  refs/heads/master baa2adbd3 -> 131e4926b


[DBCP-484] Connection leak during XATransaction in high load.

Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/131e4926
Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/131e4926
Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/131e4926

Branch: refs/heads/master
Commit: 131e4926b7a31fff3c6bead10bbe6dcd15e32bf9
Parents: baa2adb
Author: Emanuel Freitas <ej...@gmail.com>
Authored: Mon May 21 08:43:53 2018 -0600
Committer: Gary Gregory <ga...@gmail.com>
Committed: Mon May 21 08:43:53 2018 -0600

----------------------------------------------------------------------
 src/changes/changes.xml                                |  3 +++
 .../commons/dbcp2/managed/ManagedConnection.java       | 13 +++++++++++++
 2 files changed, 16 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/131e4926/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index d329d67..8ce59f5 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -61,6 +61,9 @@ The <action> type attribute can be add,update,fix,remove.
 
   <body>
     <release version="2.3.1" date="2018-MM-DD" description="This is a minor release, including bug fixes and enhancements.">
+      <action dev="ggregory" type="fix" issue="DBCP-484" due-to="Emanuel Freitas">
+        Connection leak during XATransaction in high load.
+      </action>
     </release>
     <release version="2.3.0" date="2018-05-12" description="This is a minor release, including bug fixes and enhancements.">
       <action dev="pschumacher" type="fix" issue="DBCP-476" due-to="Gary Evesson, Richard Cordova">

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/131e4926/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 a66a7a8..c50327f 100644
--- a/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
+++ b/src/main/java/org/apache/commons/dbcp2/managed/ManagedConnection.java
@@ -22,6 +22,8 @@ import org.apache.commons.pool2.ObjectPool;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * ManagedConnection is responsible for managing a database connection in a transactional environment
@@ -48,6 +50,7 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
     private final boolean accessToUnderlyingConnectionAllowed;
     private TransactionContext transactionContext;
     private boolean isSharedConnection;
+    private Lock lock;
 
     public ManagedConnection(final ObjectPool<C> pool,
             final TransactionRegistry transactionRegistry,
@@ -56,6 +59,7 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
         this.pool = pool;
         this.transactionRegistry = transactionRegistry;
         this.accessToUnderlyingConnectionAllowed = accessToUnderlyingConnectionAllowed;
+        this.lock = new ReentrantLock();
         updateTransactionStatus();
     }
 
@@ -162,11 +166,18 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
             try {
                 // Don't actually close the connection if in a transaction. The
                 // connection will be closed by the transactionComplete method.
+                //
+                // DBCP-484 we need to make sure setClosedInternal(true) being
+                // invoked if transactionContext is not null as this value will
+                // be modified by the transactionComplete method which could run
+                // in the different thread with the transaction calling back.
+                lock.lock();
                 if (transactionContext == null) {
                     super.close();
                 }
             } finally {
                 setClosedInternal(true);
+                lock.unlock();
             }
         }
     }
@@ -186,7 +197,9 @@ public class ManagedConnection<C extends Connection> extends DelegatingConnectio
     }
 
     protected void transactionComplete() {
+        lock.lock();
         transactionContext = null;
+        lock.unlock();
 
         // If we were using a shared connection, clear the reference now that
         // the transaction has completed