This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 10.1.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit ec8592c7c61b82e91c29e7333ee56978c425562a 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 3bb3bc40cb..5c3320b405 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 @@ -957,6 +957,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 7df0a262f8..3082751a36 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]
