You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2008/11/16 04:26:29 UTC

svn commit: r717972 - in /tomcat/trunk/modules/jdbc-pool: java/org/apache/tomcat/jdbc/pool/interceptor/ test/org/apache/tomcat/jdbc/test/

Author: fhanik
Date: Sat Nov 15 19:26:29 2008
New Revision: 717972

URL: http://svn.apache.org/viewvc?rev=717972&view=rev
Log:
Added an interceptor that keeps track of statements, and if they are not closed, then they will be closed automatically

Added:
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
    tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java
Modified:
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java?rev=717972&r1=717971&r2=717972&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/AbstractCreateStatementInterceptor.java Sat Nov 15 19:26:29 2008
@@ -37,15 +37,21 @@
     public  AbstractCreateStatementInterceptor() {
         super();
     }
-
+    
+    @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-        boolean process = false;
-        process = process(statements, method, process);
-        if (process) {
-            Object statement = super.invoke(proxy,method,args);
-            return createStatement(proxy,method,args,statement);
+        if (CLOSE_VAL==method.getName()) {
+            closeInvoked();
+            return super.invoke(proxy, method, args);
         } else {
-            return super.invoke(proxy,method,args);
+            boolean process = false;
+            process = process(statements, method, process);
+            if (process) {
+                Object statement = super.invoke(proxy,method,args);
+                return createStatement(proxy,method,args,statement);
+            } else {
+                return super.invoke(proxy,method,args);
+            }
         }
     }
     
@@ -59,6 +65,8 @@
      * @return
      */
     public abstract Object createStatement(Object proxy, Method method, Object[] args, Object statement);
+    
+    public abstract void closeInvoked();
 
     protected boolean process(String[] names, Method method, boolean process) {
         for (int i=0; (!process) && i<names.length; i++) {

Added: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java?rev=717972&view=auto
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java (added)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/interceptor/StatementFinalizer.java Sat Nov 15 19:26:29 2008
@@ -0,0 +1,66 @@
+/*
+ * 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.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;
+/**
+ * Keeps track of statements associated with a connection and invokes close upon connection.close()
+ * @author fhanik
+ *
+ */
+public class StatementFinalizer extends AbstractCreateStatementInterceptor {
+    protected static Log log = LogFactory.getLog(StatementFinalizer.class);
+    
+    protected ArrayList<WeakReference<Statement>> statements = new ArrayList<WeakReference<Statement>>();
+    
+    @Override
+    public Object createStatement(Object proxy, Method method, Object[] args, Object statement) {
+        // TODO Auto-generated method stub
+        try {
+            statements.add(new WeakReference((Statement)statement));
+        }catch (ClassCastException x) {
+            //ignore this one
+        }
+        return statement;
+    }
+    
+    @Override
+    public void closeInvoked() {
+        while (statements.size()>0) {
+            WeakReference<Statement> ws = statements.remove(0);
+            Statement st = ws.get();
+            if (st!=null) {
+                try {
+                    if (!st.isClosed()) {
+                        st.close();
+                    }
+                } catch (Exception ignore) {
+                    if (log.isDebugEnabled()) {
+                        log.debug("Unable to closed statement upon connection close.",ignore);
+                    }
+                }
+            }
+        }
+    }
+
+}

Added: tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java?rev=717972&view=auto
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java (added)
+++ tomcat/trunk/modules/jdbc-pool/test/org/apache/tomcat/jdbc/test/StatementFinalizerTest.java Sat Nov 15 19:26:29 2008
@@ -0,0 +1,25 @@
+package org.apache.tomcat.jdbc.test;
+
+import java.sql.Connection;
+import java.sql.Statement;
+
+import org.apache.tomcat.jdbc.pool.DataSourceProxy;
+import org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;
+
+public class StatementFinalizerTest extends DefaultTestCase {
+
+    public StatementFinalizerTest(String name) {
+        super(name);
+    }
+    
+    public void testStatementFinalization() throws Exception {
+        DataSourceProxy d1 = this.createDefaultDataSource();
+        d1.setJdbcInterceptors(StatementFinalizer.class.getName());
+        Connection con = d1.getConnection();
+        Statement st = con.createStatement();
+        assertFalse("Statement should not be closed.",st.isClosed());
+        con.close();
+        assertTrue("Statement should be closed.",st.isClosed());
+    }
+
+}



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