Author: fhanik Date: Thu Aug 7 21:47:11 2014 New Revision: 1616602 URL: http://svn.apache.org/r1616602 Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54537 Use a linked list to handle O(1) insert and remove operations.
Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java Modified: tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java?rev=1616602&r1=1616601&r2=1616602&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java (original) +++ tomcat/trunk/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java Thu Aug 7 21:47:11 2014 @@ -16,15 +16,16 @@ */ package org.apache.tomcat.jdbc.pool.interceptor; -import java.lang.ref.WeakReference; -import java.lang.reflect.Method; -import java.sql.Statement; -import java.util.ArrayList; - import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.jdbc.pool.ConnectionPool; import org.apache.tomcat.jdbc.pool.PooledConnection; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Method; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.List; /** * Keeps track of statements associated with a connection and invokes close upon {@link java.sql.Connection#close()} * Useful for applications that dont close the associated statements after being done with a connection. @@ -33,7 +34,7 @@ import org.apache.tomcat.jdbc.pool.Poole public class StatementFinalizer extends AbstractCreateStatementInterceptor { private static final Log log = LogFactory.getLog(StatementFinalizer.class); - protected ArrayList<WeakReference<Statement>> statements = new ArrayList<>(); + protected List<WeakReference<Statement>> statements = new LinkedList<>(); @Override public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) { Modified: tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java?rev=1616602&r1=1616601&r2=1616602&view=diff ============================================================================== --- tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java (original) +++ tomcat/trunk/modules/jdbc-pool/src/test/java/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java Thu Aug 7 21:47:11 2014 @@ -35,4 +35,22 @@ public class StatementFinalizerTest exte con.close(); Assert.assertTrue("Statement should be closed.",st.isClosed()); } + + + @Test + public void testStatementFinalizationForMultiple() throws Exception { + datasource.setJdbcInterceptors(StatementFinalizer.class.getName()); + Connection con = datasource.getConnection(); + Statement[] statements = new Statement[1000]; + for (int i = 0; i < statements.length; i++) { + statements[i] = con.createStatement(); + } + for (Statement st : statements) { + Assert.assertFalse("Statement should not be closed.", st.isClosed()); + } + con.close(); + for (Statement st : statements) { + Assert.assertTrue("Statement should be closed.", st.isClosed()); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org