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]