This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/11.0.x by this push:
     new 446466c9d8 tomcat-jdbc check if returned connection is closed
446466c9d8 is described below

commit 446466c9d8ab672bcf4c1ada20464a4023af1683
Author: Alex Panchenko <[email protected]>
AuthorDate: Thu Jan 16 10:53:21 2020 +0200

    tomcat-jdbc check if returned connection is closed
---
 .../apache/tomcat/jdbc/pool/ConnectionPool.java    |  8 +++++++
 .../apache/tomcat/jdbc/test/TestValidation.java    | 25 +++++++++++++++++++++-
 .../apache/tomcat/jdbc/test/driver/Connection.java |  4 +++-
 webapps/docs/changelog.xml                         |  9 ++++++++
 4 files changed, 44 insertions(+), 2 deletions(-)

diff --git 
a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 
b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
index 66a6a6c3fe..469bf08a65 100644
--- 
a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
+++ 
b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
@@ -955,6 +955,14 @@ public class ConnectionPool {
         if (con.isDiscarded()) {
           return true;
         }
+        try {
+            if (con.isClosed()) {
+                return true;
+            }
+        } catch (SQLException e) {
+            log.warn("Unable to check if connection is closed", e);
+            return true;
+        }
         if (isClosed()) {
           return true;
         }
diff --git 
a/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/TestValidation.java
 
b/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/TestValidation.java
index d996173618..95bf752358 100644
--- 
a/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/TestValidation.java
+++ 
b/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/TestValidation.java
@@ -33,6 +33,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.tomcat.jdbc.pool.ConnectionPool;
+
 public class TestValidation extends DefaultTestCase {
 
     public static final Boolean WITHAUTOCOMMIT = Boolean.TRUE;
@@ -141,6 +143,27 @@ public class TestValidation extends DefaultTestCase {
         Assert.assertFalse("No transaction must be running after connection is 
obtained", getMock(cxn).isRunningTransaction());
     }
 
+    @Test
+    public void returnClosedConnection() throws SQLException {
+        ConnectionPool pool = datasource.createPool();
+        pool.resetStats();
+        Assert.assertFalse(datasource.getPoolProperties().isTestOnBorrow());
+        Assert.assertFalse(datasource.getPoolProperties().isTestOnReturn());
+        Assert.assertFalse(datasource.getPoolProperties().isTestWhileIdle());
+        try (Connection connection = datasource.getConnection()) {
+            Assert.assertEquals("size", 1, pool.getSize());
+            Connection realConnection = ((PooledConnection) 
connection).getConnection();
+            Assert.assertNotSame(connection, realConnection);
+            realConnection.close();
+            Assert.assertTrue(realConnection.isClosed());
+            Assert.assertFalse(connection.isClosed());
+        }
+        Assert.assertEquals("borrowed", 1, pool.getBorrowedCount());
+        Assert.assertEquals("returned", 1, pool.getReturnedCount());
+        Assert.assertEquals("released", 1, pool.getReleasedCount());
+        Assert.assertEquals("size", 0, pool.getSize());
+    }
+
     @Test
     public void 
testOnConnectValidationSuccessWithValidationQueryAndAutoCommitEnabled() throws 
SQLException {
         checkOnConnectValidationWithOutcome(ValidationOutcome.SUCCESS, 
WITHVALIDATIONQUERY, WITHAUTOCOMMIT);
@@ -644,4 +667,4 @@ public class TestValidation extends DefaultTestCase {
         }
     }
 
-}
\ No newline at end of file
+}
diff --git 
a/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/driver/Connection.java
 
b/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/driver/Connection.java
index 55ca60acff..afa577052b 100644
--- 
a/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/driver/Connection.java
+++ 
b/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/driver/Connection.java
@@ -38,6 +38,7 @@ import org.apache.tomcat.jdbc.pool.PooledConnection;
 
 public class Connection implements java.sql.Connection {
     Properties info;
+    private boolean closed = false;
 
     public Connection(Properties info) {
         this.info = info;
@@ -57,6 +58,7 @@ public class Connection implements java.sql.Connection {
 
     @Override
     public void close() throws SQLException {
+        closed = true;
         Driver.disconnectCount.incrementAndGet();
     }
 
@@ -156,7 +158,7 @@ public class Connection implements java.sql.Connection {
 
     @Override
     public boolean isClosed() throws SQLException {
-        return false;
+        return closed;
     }
 
     @Override
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index ecb57ce2c4..b8e35504d9 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -164,6 +164,15 @@
       </add>
     </changelog>
   </subsection>
+  <subsection name="jdbc-pool">
+    <changelog>
+      <fix>
+        <bug>64083</bug>: If the underlying connection has been closed, don't
+        add it to the pool when it is returned. Pull request <pr>235</pr> by
+        Alex Panchenko. (markt)
+      </fix>
+    </changelog>
+  </subsection>
   <subsection name="Other">
     <changelog>
       <update>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to