Author: fhanik
Date: Thu Aug  7 21:04:11 2014
New Revision: 1616594

URL: http://svn.apache.org/r1616594
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54227
MaxAge should be honored upon borrow as well, to assure that no connection is 
ever used if it has been connected longer than designated time.

Added:
    
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java
   (with props)
Modified:
    
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java

Modified: 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=1616594&r1=1616593&r2=1616594&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
 Thu Aug  7 21:04:11 2014
@@ -279,6 +279,10 @@ public class ConnectionPool {
      * @throws SQLException if an interceptor can't be configured, if the 
proxy can't be instantiated
      */
     protected Connection setupConnection(PooledConnection con) throws 
SQLException {
+        //check if it's been sitting in the pool too long
+        if (con.isMaxAgeExpired()) {
+            con.reconnect();
+        }
         //fetch previously cached interceptor proxy - one per connection
         JdbcInterceptor handler = con.getHandler();
         if (handler==null) {
@@ -862,11 +866,8 @@ public class ConnectionPool {
         if (isClosed()) return true;
         if (!con.validate(action)) return true;
         if (!terminateTransaction(con)) return true;
-        if (getPoolProperties().getMaxAge()>0 ) {
-            return (System.currentTimeMillis()-con.getLastConnected()) > 
getPoolProperties().getMaxAge();
-        } else {
-            return false;
-        }
+        if (con.isMaxAgeExpired()) return true;
+        else return false;
     }
 
     /**

Modified: 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=1616594&r1=1616593&r2=1616594&view=diff
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 (original)
+++ 
tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
 Thu Aug  7 21:04:11 2014
@@ -318,6 +318,19 @@ public class PooledConnection {
     }
 
     /**
+     * Returns true if the connection has been connected more than 
+     * {@link PoolConfiguration#getMaxAge()} milliseconds. false otherwise.
+     * @return Returns true if the connection has been connected more than 
+     * {@link PoolConfiguration#getMaxAge()} milliseconds. false otherwise.
+     */
+    public boolean isMaxAgeExpired() {
+        if (getPoolProperties().getMaxAge()>0 ) {
+            return (System.currentTimeMillis() - getLastConnected()) > 
getPoolProperties().getMaxAge();
+        } else {
+            return false;
+        }
+    }
+    /**
      * Issues a call to {@link #disconnect(boolean)} with the argument false 
followed by a call to
      * {@link #connect()}
      * @throws SQLException if the call to {@link #connect()} fails.

Added: 
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java?rev=1616594&view=auto
==============================================================================
--- 
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java
 (added)
+++ 
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java
 Thu Aug  7 21:04:11 2014
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.jdbc.bugs;
+
+import org.apache.tomcat.jdbc.pool.DataSource;
+import org.apache.tomcat.jdbc.pool.PoolProperties;
+import org.apache.tomcat.jdbc.test.DefaultProperties;
+import org.junit.Test;
+
+import javax.sql.PooledConnection;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
+
+public class Bug54227 {
+
+
+    public Bug54227() {
+    }
+
+    @Test
+    public void testPool() throws SQLException, InterruptedException {
+        PoolProperties poolProperties = new DefaultProperties();
+        poolProperties.setMinIdle(0);
+        poolProperties.setInitialSize(0);
+        poolProperties.setMaxActive(1);
+        poolProperties.setMaxWait(5000);
+        poolProperties.setMaxAge(100);
+        poolProperties.setRemoveAbandoned(false);
+
+        final DataSource ds = new DataSource(poolProperties);
+        Connection con;
+        Connection actual1;
+        Connection actual2;
+
+        con = ds.getConnection();
+        actual1 = ((PooledConnection)con).getConnection();
+        con.close();
+        con = ds.getConnection();
+        actual2 = ((PooledConnection)con).getConnection();
+        assertSame(actual1, actual2);
+        con.close();
+        Thread.sleep(150);
+        con = ds.getConnection();
+        actual2 = ((PooledConnection)con).getConnection();
+        assertNotSame(actual1, actual2);
+        con.close();
+    }
+}
\ No newline at end of file

Propchange: 
tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/bugs/Bug54227.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to