diff --git a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java index 84843ff39574..8a5f1beed6e0 100644 --- a/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java +++ b/modules/jdbc-pool/src/main/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java @@ -19,6 +19,7 @@ import java.lang.ref.WeakReference; import java.lang.reflect.Method; import java.sql.Statement; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -49,11 +50,13 @@ public StatementFinalizer() { } private boolean logCreationStack = false; + private int createStatementCount=0; @Override public Object createStatement(Object proxy, Method method, Object[] args, Object statement, long time) { try { if (statement instanceof Statement) { + clearEntry(); statements.add(new StatementEntry((Statement)statement)); } }catch (ClassCastException x) { @@ -102,9 +105,22 @@ public void reset(ConnectionPool parent, PooledConnection con) { super.reset(parent, con); } - /** - * Entry that tracks a statement and its allocation stack. - */ + + public void clearEntry() { + if(createStatementCount%10!=0) { + createStatementCount++; + return; + }else { + createStatementCount=0; + statements.removeIf(entry -> { + Statement stmt = entry.getStatement(); + return stmt == null || stmt.isClosed(); + }); + + } + } + + protected class StatementEntry { private WeakReference statement; private Throwable allocationStack;